1use prost::{
2 bytes::{Buf, BufMut},
3 encoding::{DecodeContext, WireType},
4 DecodeError, Message,
5};
6
7use crate::{
8 descriptor::{FieldDescriptor, Kind, MAP_ENTRY_KEY_NUMBER, MAP_ENTRY_VALUE_NUMBER},
9 DynamicMessage, MapKey, Value,
10};
11
12use super::{
13 fields::{FieldDescriptorLike, ValueAndDescriptor},
14 unknown::UnknownField,
15};
16
17impl Message for DynamicMessage {
18 fn encode_raw(&self, buf: &mut impl BufMut)
19 where
20 Self: Sized,
21 {
22 for field in self.fields.iter(&self.desc, false, false) {
23 match field {
24 ValueAndDescriptor::Field(value, field_desc) => {
25 value.encode_field(&field_desc, buf)
26 }
27 ValueAndDescriptor::Extension(value, extension_desc) => {
28 value.encode_field(&extension_desc, buf)
29 }
30 ValueAndDescriptor::Unknown(unknowns) => unknowns.encode_raw(buf),
31 }
32 }
33 }
34
35 fn merge_field(
36 &mut self,
37 number: u32,
38 wire_type: WireType,
39 buf: &mut impl Buf,
40 ctx: DecodeContext,
41 ) -> Result<(), DecodeError>
42 where
43 Self: Sized,
44 {
45 if let Some(field_desc) = self.desc.get_field(number) {
46 self.get_field_mut(&field_desc)
47 .merge_field(&field_desc, wire_type, buf, ctx)
48 } else if let Some(extension_desc) = self.desc.get_extension(number) {
49 self.get_extension_mut(&extension_desc).merge_field(
50 &extension_desc,
51 wire_type,
52 buf,
53 ctx,
54 )
55 } else {
56 let field = UnknownField::decode_value(number, wire_type, buf, ctx)?;
57 self.fields.add_unknown(number, field);
58 Ok(())
59 }
60 }
61
62 fn encoded_len(&self) -> usize {
63 let mut len = 0;
64 for field in self.fields.iter(&self.desc, false, false) {
65 match field {
66 ValueAndDescriptor::Field(value, field_desc) => {
67 len += value.encoded_len(&field_desc);
68 }
69 ValueAndDescriptor::Extension(value, extension_desc) => {
70 len += value.encoded_len(&extension_desc);
71 }
72 ValueAndDescriptor::Unknown(unknowns) => len += unknowns.encoded_len(),
73 }
74 }
75 len
76 }
77
78 fn clear(&mut self) {
79 self.fields.clear_all();
80 }
81}
82
83impl Value {
84 pub(super) fn encode_field<B>(&self, field_desc: &impl FieldDescriptorLike, buf: &mut B)
85 where
86 B: BufMut,
87 {
88 if !field_desc.supports_presence() && field_desc.is_default_value(self) {
89 return;
90 }
91
92 let number = field_desc.number();
93 match (self, field_desc.kind()) {
94 (Value::Bool(value), Kind::Bool) => prost::encoding::bool::encode(number, value, buf),
95 (Value::I32(value), Kind::Int32) => prost::encoding::int32::encode(number, value, buf),
96 (Value::I32(value), Kind::Sint32) => {
97 prost::encoding::sint32::encode(number, value, buf)
98 }
99 (Value::I32(value), Kind::Sfixed32) => {
100 prost::encoding::sfixed32::encode(number, value, buf)
101 }
102 (Value::I64(value), Kind::Int64) => prost::encoding::int64::encode(number, value, buf),
103 (Value::I64(value), Kind::Sint64) => {
104 prost::encoding::sint64::encode(number, value, buf)
105 }
106 (Value::I64(value), Kind::Sfixed64) => {
107 prost::encoding::sfixed64::encode(number, value, buf)
108 }
109 (Value::U32(value), Kind::Uint32) => {
110 prost::encoding::uint32::encode(number, value, buf)
111 }
112 (Value::U32(value), Kind::Fixed32) => {
113 prost::encoding::fixed32::encode(number, value, buf)
114 }
115 (Value::U64(value), Kind::Uint64) => {
116 prost::encoding::uint64::encode(number, value, buf)
117 }
118 (Value::U64(value), Kind::Fixed64) => {
119 prost::encoding::fixed64::encode(number, value, buf)
120 }
121 (Value::F32(value), Kind::Float) => prost::encoding::float::encode(number, value, buf),
122 (Value::F64(value), Kind::Double) => {
123 prost::encoding::double::encode(number, value, buf)
124 }
125 (Value::String(value), Kind::String) => {
126 prost::encoding::string::encode(number, value, buf)
127 }
128 (Value::Bytes(value), Kind::Bytes) => {
129 prost::encoding::bytes::encode(number, value, buf)
130 }
131 (Value::EnumNumber(value), Kind::Enum(_)) => {
132 prost::encoding::int32::encode(number, value, buf)
133 }
134 (Value::Message(message), Kind::Message(_)) => {
135 if field_desc.is_group() {
136 prost::encoding::group::encode(number, message, buf)
137 } else {
138 prost::encoding::message::encode(number, message, buf)
139 }
140 }
141 (Value::List(values), _) if field_desc.is_list() => {
142 if field_desc.is_packed() {
143 match field_desc.kind() {
144 Kind::Enum(_) => encode_packed_list(
145 number,
146 values
147 .iter()
148 .map(|v| v.as_enum_number().expect("expected enum number")),
149 buf,
150 |v, b| prost::encoding::encode_varint(v as u64, b),
151 |v| prost::encoding::encoded_len_varint(v as u64),
152 ),
153 Kind::Double => encode_packed_list(
154 number,
155 values.iter().map(|v| v.as_f64().expect("expected double")),
156 buf,
157 |v, b| b.put_f64_le(v),
158 |_| 8,
159 ),
160 Kind::Float => encode_packed_list(
161 number,
162 values.iter().map(|v| v.as_f32().expect("expected float")),
163 buf,
164 |v, b| b.put_f32_le(v),
165 |_| 4,
166 ),
167 Kind::Int32 => encode_packed_list(
168 number,
169 values.iter().map(|v| v.as_i32().expect("expected i32")),
170 buf,
171 |v, b| prost::encoding::encode_varint(v as u64, b),
172 |v| prost::encoding::encoded_len_varint(v as u64),
173 ),
174 Kind::Int64 => encode_packed_list(
175 number,
176 values.iter().map(|v| v.as_i64().expect("expected i64")),
177 buf,
178 |v, b| prost::encoding::encode_varint(v as u64, b),
179 |v| prost::encoding::encoded_len_varint(v as u64),
180 ),
181 Kind::Uint32 => encode_packed_list(
182 number,
183 values.iter().map(|v| v.as_u32().expect("expected u32")),
184 buf,
185 |v, b| prost::encoding::encode_varint(v as u64, b),
186 |v| prost::encoding::encoded_len_varint(v as u64),
187 ),
188 Kind::Uint64 => encode_packed_list(
189 number,
190 values.iter().map(|v| v.as_u64().expect("expected u64")),
191 buf,
192 |v, b| prost::encoding::encode_varint(v, b),
193 prost::encoding::encoded_len_varint,
194 ),
195 Kind::Sint32 => encode_packed_list(
196 number,
197 values.iter().map(|v| v.as_i32().expect("expected i32")),
198 buf,
199 |v, b| prost::encoding::encode_varint(from_sint32(v) as u64, b),
200 |v| prost::encoding::encoded_len_varint(from_sint32(v) as u64),
201 ),
202 Kind::Sint64 => encode_packed_list(
203 number,
204 values.iter().map(|v| v.as_i64().expect("expected i64")),
205 buf,
206 |v, b| prost::encoding::encode_varint(from_sint64(v), b),
207 |v| prost::encoding::encoded_len_varint(from_sint64(v)),
208 ),
209 Kind::Fixed32 => encode_packed_list(
210 number,
211 values.iter().map(|v| v.as_u32().expect("expected u32")),
212 buf,
213 |v, b| b.put_u32_le(v),
214 |_| 4,
215 ),
216 Kind::Fixed64 => encode_packed_list(
217 number,
218 values.iter().map(|v| v.as_u64().expect("expected u64")),
219 buf,
220 |v, b| b.put_u64_le(v),
221 |_| 8,
222 ),
223 Kind::Sfixed32 => encode_packed_list(
224 number,
225 values.iter().map(|v| v.as_i32().expect("expected i32")),
226 buf,
227 |v, b| b.put_i32_le(v),
228 |_| 4,
229 ),
230 Kind::Sfixed64 => encode_packed_list(
231 number,
232 values.iter().map(|v| v.as_i64().expect("expected i64")),
233 buf,
234 |v, b| b.put_i64_le(v),
235 |_| 8,
236 ),
237 Kind::Bool => encode_packed_list(
238 number,
239 values.iter().map(|v| v.as_bool().expect("expected bool")),
240 buf,
241 |v, b| prost::encoding::encode_varint(v as u64, b),
242 |v| prost::encoding::encoded_len_varint(v as u64),
243 ),
244 _ => panic!("invalid type for packed field in DynamicMessage"),
245 }
246 } else {
247 for value in values {
248 value.encode_field(field_desc, buf);
249 }
250 }
251 }
252 (Value::Map(values), Kind::Message(map_entry)) if field_desc.is_map() => {
253 let key_desc = map_entry.get_field(MAP_ENTRY_KEY_NUMBER).unwrap();
254 let value_desc = map_entry.get_field(MAP_ENTRY_VALUE_NUMBER).unwrap();
255
256 for (key, value) in values {
257 let len = key.encoded_len(&key_desc) + value.encoded_len(&value_desc);
258
259 prost::encoding::encode_key(number, WireType::LengthDelimited, buf);
260 prost::encoding::encode_varint(len as u64, buf);
261
262 key.encode_field(&key_desc, buf);
263 value.encode_field(&value_desc, buf);
264 }
265 }
266 (value, ty) => panic!(
267 "mismatch between DynamicMessage value {:?} and type {:?}",
268 value, ty
269 ),
270 }
271 }
272
273 pub(super) fn merge_field<B>(
274 &mut self,
275 field_desc: &impl FieldDescriptorLike,
276 wire_type: WireType,
277 buf: &mut B,
278 ctx: DecodeContext,
279 ) -> Result<(), DecodeError>
280 where
281 B: Buf,
282 {
283 match (self, field_desc.kind()) {
284 (Value::Bool(value), Kind::Bool) => {
285 prost::encoding::bool::merge(wire_type, value, buf, ctx)
286 }
287 (Value::I32(value), Kind::Int32) => {
288 prost::encoding::int32::merge(wire_type, value, buf, ctx)
289 }
290 (Value::I32(value), Kind::Sint32) => {
291 prost::encoding::sint32::merge(wire_type, value, buf, ctx)
292 }
293 (Value::I32(value), Kind::Sfixed32) => {
294 prost::encoding::sfixed32::merge(wire_type, value, buf, ctx)
295 }
296 (Value::I64(value), Kind::Int64) => {
297 prost::encoding::int64::merge(wire_type, value, buf, ctx)
298 }
299 (Value::I64(value), Kind::Sint64) => {
300 prost::encoding::sint64::merge(wire_type, value, buf, ctx)
301 }
302 (Value::I64(value), Kind::Sfixed64) => {
303 prost::encoding::sfixed64::merge(wire_type, value, buf, ctx)
304 }
305 (Value::U32(value), Kind::Uint32) => {
306 prost::encoding::uint32::merge(wire_type, value, buf, ctx)
307 }
308 (Value::U32(value), Kind::Fixed32) => {
309 prost::encoding::fixed32::merge(wire_type, value, buf, ctx)
310 }
311 (Value::U64(value), Kind::Uint64) => {
312 prost::encoding::uint64::merge(wire_type, value, buf, ctx)
313 }
314 (Value::U64(value), Kind::Fixed64) => {
315 prost::encoding::fixed64::merge(wire_type, value, buf, ctx)
316 }
317 (Value::F32(value), Kind::Float) => {
318 prost::encoding::float::merge(wire_type, value, buf, ctx)
319 }
320 (Value::F64(value), Kind::Double) => {
321 prost::encoding::double::merge(wire_type, value, buf, ctx)
322 }
323 (Value::String(value), Kind::String) => {
324 prost::encoding::string::merge(wire_type, value, buf, ctx)
325 }
326 (Value::Bytes(value), Kind::Bytes) => {
327 prost::encoding::bytes::merge(wire_type, value, buf, ctx)
328 }
329 (Value::EnumNumber(value), Kind::Enum(_)) => {
330 prost::encoding::int32::merge(wire_type, value, buf, ctx)
331 }
332 (Value::Message(message), Kind::Message(_)) => {
333 if field_desc.is_group() {
334 prost::encoding::group::merge(field_desc.number(), wire_type, message, buf, ctx)
335 } else {
336 prost::encoding::message::merge(wire_type, message, buf, ctx)
337 }
338 }
339 (Value::List(values), field_kind) if field_desc.is_list() => {
340 if wire_type == WireType::LengthDelimited && field_desc.is_packable() {
341 prost::encoding::merge_loop(values, buf, ctx, |values, buf, ctx| {
342 let mut value = Value::default_value(&field_kind);
343 value.merge_field(field_desc, field_kind.wire_type(), buf, ctx)?;
344 values.push(value);
345 Ok(())
346 })
347 } else {
348 let mut value = Value::default_value(&field_kind);
349 value.merge_field(field_desc, wire_type, buf, ctx)?;
350 values.push(value);
351 Ok(())
352 }
353 }
354 (Value::Map(values), Kind::Message(map_entry)) if field_desc.is_map() => {
355 let key_desc = map_entry.get_field(MAP_ENTRY_KEY_NUMBER).unwrap();
356 let value_desc = map_entry.get_field(MAP_ENTRY_VALUE_NUMBER).unwrap();
357
358 let mut key = MapKey::default_value(&key_desc.kind());
359 let mut value = Value::default_value_for_field(&value_desc);
360 prost::encoding::merge_loop(
361 &mut (&mut key, &mut value),
362 buf,
363 ctx,
364 |(key, value), buf, ctx| {
365 let (number, wire_type) = prost::encoding::decode_key(buf)?;
366 match number {
367 MAP_ENTRY_KEY_NUMBER => key.merge_field(&key_desc, wire_type, buf, ctx),
368 MAP_ENTRY_VALUE_NUMBER => {
369 value.merge_field(&value_desc, wire_type, buf, ctx)
370 }
371 _ => prost::encoding::skip_field(wire_type, number, buf, ctx),
372 }
373 },
374 )?;
375 values.insert(key, value);
376
377 Ok(())
378 }
379 (value, ty) => panic!(
380 "mismatch between DynamicMessage value {:?} and type {:?}",
381 value, ty
382 ),
383 }
384 }
385
386 pub(super) fn encoded_len(&self, field_desc: &impl FieldDescriptorLike) -> usize {
387 if !field_desc.supports_presence() && field_desc.is_default_value(self) {
388 return 0;
389 }
390
391 let number = field_desc.number();
392 match (self, field_desc.kind()) {
393 (Value::Bool(value), Kind::Bool) => prost::encoding::bool::encoded_len(number, value),
394 (Value::I32(value), Kind::Int32) => prost::encoding::int32::encoded_len(number, value),
395 (Value::I32(value), Kind::Sint32) => {
396 prost::encoding::sint32::encoded_len(number, value)
397 }
398 (Value::I32(value), Kind::Sfixed32) => {
399 prost::encoding::sfixed32::encoded_len(number, value)
400 }
401 (Value::I64(value), Kind::Int64) => prost::encoding::int64::encoded_len(number, value),
402 (Value::I64(value), Kind::Sint64) => {
403 prost::encoding::sint64::encoded_len(number, value)
404 }
405 (Value::I64(value), Kind::Sfixed64) => {
406 prost::encoding::sfixed64::encoded_len(number, value)
407 }
408 (Value::U32(value), Kind::Uint32) => {
409 prost::encoding::uint32::encoded_len(number, value)
410 }
411 (Value::U32(value), Kind::Fixed32) => {
412 prost::encoding::fixed32::encoded_len(number, value)
413 }
414 (Value::U64(value), Kind::Uint64) => {
415 prost::encoding::uint64::encoded_len(number, value)
416 }
417 (Value::U64(value), Kind::Fixed64) => {
418 prost::encoding::fixed64::encoded_len(number, value)
419 }
420 (Value::F32(value), Kind::Float) => prost::encoding::float::encoded_len(number, value),
421 (Value::F64(value), Kind::Double) => {
422 prost::encoding::double::encoded_len(number, value)
423 }
424 (Value::String(value), Kind::String) => {
425 prost::encoding::string::encoded_len(number, value)
426 }
427 (Value::Bytes(value), Kind::Bytes) => {
428 prost::encoding::bytes::encoded_len(number, value)
429 }
430 (Value::EnumNumber(value), Kind::Enum(_)) => {
431 prost::encoding::int32::encoded_len(number, value)
432 }
433 (Value::Message(message), Kind::Message(_)) => {
434 if field_desc.is_group() {
435 prost::encoding::group::encoded_len(number, message)
436 } else {
437 prost::encoding::message::encoded_len(number, message)
438 }
439 }
440 (Value::List(values), _) if field_desc.is_list() => {
441 if field_desc.is_packed() {
442 match field_desc.kind() {
443 Kind::Enum(_) => packed_list_encoded_len(
444 number,
445 values
446 .iter()
447 .map(|v| v.as_enum_number().expect("expected enum number")),
448 |v| prost::encoding::encoded_len_varint(v as u64),
449 ),
450 Kind::Double => packed_list_encoded_len(
451 number,
452 values.iter().map(|v| v.as_f64().expect("expected double")),
453 |_| 8,
454 ),
455 Kind::Float => packed_list_encoded_len(
456 number,
457 values.iter().map(|v| v.as_f32().expect("expected float")),
458 |_| 4,
459 ),
460 Kind::Int32 => packed_list_encoded_len(
461 number,
462 values.iter().map(|v| v.as_i32().expect("expected i32")),
463 |v| prost::encoding::encoded_len_varint(v as u64),
464 ),
465 Kind::Int64 => packed_list_encoded_len(
466 number,
467 values.iter().map(|v| v.as_i64().expect("expected i64")),
468 |v| prost::encoding::encoded_len_varint(v as u64),
469 ),
470 Kind::Uint32 => packed_list_encoded_len(
471 number,
472 values.iter().map(|v| v.as_u32().expect("expected u32")),
473 |v| prost::encoding::encoded_len_varint(v as u64),
474 ),
475 Kind::Uint64 => packed_list_encoded_len(
476 number,
477 values.iter().map(|v| v.as_u64().expect("expected u64")),
478 prost::encoding::encoded_len_varint,
479 ),
480 Kind::Sint32 => packed_list_encoded_len(
481 number,
482 values.iter().map(|v| v.as_i32().expect("expected i32")),
483 |v| prost::encoding::encoded_len_varint(from_sint32(v) as u64),
484 ),
485 Kind::Sint64 => packed_list_encoded_len(
486 number,
487 values.iter().map(|v| v.as_i64().expect("expected i64")),
488 |v| prost::encoding::encoded_len_varint(from_sint64(v)),
489 ),
490 Kind::Fixed32 => packed_list_encoded_len(
491 number,
492 values.iter().map(|v| v.as_u32().expect("expected u32")),
493 |_| 4,
494 ),
495 Kind::Fixed64 => packed_list_encoded_len(
496 number,
497 values.iter().map(|v| v.as_u64().expect("expected u64")),
498 |_| 8,
499 ),
500 Kind::Sfixed32 => packed_list_encoded_len(
501 number,
502 values.iter().map(|v| v.as_i32().expect("expected i32")),
503 |_| 4,
504 ),
505 Kind::Sfixed64 => packed_list_encoded_len(
506 number,
507 values.iter().map(|v| v.as_i64().expect("expected i64")),
508 |_| 8,
509 ),
510 Kind::Bool => packed_list_encoded_len(
511 number,
512 values.iter().map(|v| v.as_bool().expect("expected bool")),
513 |v| prost::encoding::encoded_len_varint(v as u64),
514 ),
515 _ => panic!("invalid type for packed field in DynamicMessage"),
516 }
517 } else {
518 values
519 .iter()
520 .map(|value| value.encoded_len(field_desc))
521 .sum()
522 }
523 }
524 (Value::Map(values), Kind::Message(map_entry)) if field_desc.is_map() => {
525 let key_desc = map_entry.map_entry_key_field();
526 let value_desc = map_entry.map_entry_value_field();
527
528 let key_len = prost::encoding::key_len(number);
529 values
530 .iter()
531 .map(|(key, value)| {
532 let len = key.encoded_len(&key_desc) + value.encoded_len(&value_desc);
533
534 key_len + prost::encoding::encoded_len_varint(len as u64) + len
535 })
536 .sum::<usize>()
537 }
538 (value, ty) => panic!(
539 "mismatch between DynamicMessage value {:?} and type {:?}",
540 value, ty
541 ),
542 }
543 }
544}
545
546impl MapKey {
547 fn encode_field<B>(&self, field_desc: &FieldDescriptor, buf: &mut B)
548 where
549 B: BufMut,
550 {
551 if !field_desc.supports_presence() && self.is_default(&field_desc.kind()) {
552 return;
553 }
554
555 let number = field_desc.number();
556 match (self, field_desc.kind()) {
557 (MapKey::Bool(value), Kind::Bool) => prost::encoding::bool::encode(number, value, buf),
558 (MapKey::I32(value), Kind::Int32) => prost::encoding::int32::encode(number, value, buf),
559 (MapKey::I32(value), Kind::Sint32) => {
560 prost::encoding::sint32::encode(number, value, buf)
561 }
562 (MapKey::I32(value), Kind::Sfixed32) => {
563 prost::encoding::sfixed32::encode(number, value, buf)
564 }
565 (MapKey::I64(value), Kind::Int64) => prost::encoding::int64::encode(number, value, buf),
566 (MapKey::I64(value), Kind::Sint64) => {
567 prost::encoding::sint64::encode(number, value, buf)
568 }
569 (MapKey::I64(value), Kind::Sfixed64) => {
570 prost::encoding::sfixed64::encode(number, value, buf)
571 }
572 (MapKey::U32(value), Kind::Uint32) => {
573 prost::encoding::uint32::encode(number, value, buf)
574 }
575 (MapKey::U32(value), Kind::Fixed32) => {
576 prost::encoding::fixed32::encode(number, value, buf)
577 }
578 (MapKey::U64(value), Kind::Uint64) => {
579 prost::encoding::uint64::encode(number, value, buf)
580 }
581 (MapKey::U64(value), Kind::Fixed64) => {
582 prost::encoding::fixed64::encode(number, value, buf)
583 }
584 (MapKey::String(value), Kind::String) => {
585 prost::encoding::string::encode(number, value, buf)
586 }
587 (value, ty) => panic!(
588 "mismatch between DynamicMessage value {:?} and type {:?}",
589 value, ty
590 ),
591 }
592 }
593
594 fn merge_field<B>(
595 &mut self,
596 field_desc: &FieldDescriptor,
597 wire_type: WireType,
598 buf: &mut B,
599 ctx: DecodeContext,
600 ) -> Result<(), DecodeError>
601 where
602 B: Buf,
603 {
604 match (self, field_desc.kind()) {
605 (MapKey::Bool(value), Kind::Bool) => {
606 prost::encoding::bool::merge(wire_type, value, buf, ctx)
607 }
608 (MapKey::I32(value), Kind::Int32) => {
609 prost::encoding::int32::merge(wire_type, value, buf, ctx)
610 }
611 (MapKey::I32(value), Kind::Sint32) => {
612 prost::encoding::sint32::merge(wire_type, value, buf, ctx)
613 }
614 (MapKey::I32(value), Kind::Sfixed32) => {
615 prost::encoding::sfixed32::merge(wire_type, value, buf, ctx)
616 }
617 (MapKey::I64(value), Kind::Int64) => {
618 prost::encoding::int64::merge(wire_type, value, buf, ctx)
619 }
620 (MapKey::I64(value), Kind::Sint64) => {
621 prost::encoding::sint64::merge(wire_type, value, buf, ctx)
622 }
623 (MapKey::I64(value), Kind::Sfixed64) => {
624 prost::encoding::sfixed64::merge(wire_type, value, buf, ctx)
625 }
626 (MapKey::U32(value), Kind::Uint32) => {
627 prost::encoding::uint32::merge(wire_type, value, buf, ctx)
628 }
629 (MapKey::U32(value), Kind::Fixed32) => {
630 prost::encoding::fixed32::merge(wire_type, value, buf, ctx)
631 }
632 (MapKey::U64(value), Kind::Uint64) => {
633 prost::encoding::uint64::merge(wire_type, value, buf, ctx)
634 }
635 (MapKey::U64(value), Kind::Fixed64) => {
636 prost::encoding::fixed64::merge(wire_type, value, buf, ctx)
637 }
638 (MapKey::String(value), Kind::String) => {
639 prost::encoding::string::merge(wire_type, value, buf, ctx)
640 }
641 (value, ty) => panic!(
642 "mismatch between DynamicMessage value {:?} and type {:?}",
643 value, ty
644 ),
645 }
646 }
647
648 fn encoded_len(&self, field_desc: &FieldDescriptor) -> usize {
649 if !field_desc.supports_presence() && self.is_default(&field_desc.kind()) {
650 return 0;
651 }
652
653 let number = field_desc.number();
654 match (self, field_desc.kind()) {
655 (MapKey::Bool(value), Kind::Bool) => prost::encoding::bool::encoded_len(number, value),
656 (MapKey::I32(value), Kind::Int32) => prost::encoding::int32::encoded_len(number, value),
657 (MapKey::I32(value), Kind::Sint32) => {
658 prost::encoding::sint32::encoded_len(number, value)
659 }
660 (MapKey::I32(value), Kind::Sfixed32) => {
661 prost::encoding::sfixed32::encoded_len(number, value)
662 }
663 (MapKey::I64(value), Kind::Int64) => prost::encoding::int64::encoded_len(number, value),
664 (MapKey::I64(value), Kind::Sint64) => {
665 prost::encoding::sint64::encoded_len(number, value)
666 }
667 (MapKey::I64(value), Kind::Sfixed64) => {
668 prost::encoding::sfixed64::encoded_len(number, value)
669 }
670 (MapKey::U32(value), Kind::Uint32) => {
671 prost::encoding::uint32::encoded_len(number, value)
672 }
673 (MapKey::U32(value), Kind::Fixed32) => {
674 prost::encoding::fixed32::encoded_len(number, value)
675 }
676 (MapKey::U64(value), Kind::Uint64) => {
677 prost::encoding::uint64::encoded_len(number, value)
678 }
679 (MapKey::U64(value), Kind::Fixed64) => {
680 prost::encoding::fixed64::encoded_len(number, value)
681 }
682 (MapKey::String(value), Kind::String) => {
683 prost::encoding::string::encoded_len(number, value)
684 }
685 (value, ty) => panic!(
686 "mismatch between DynamicMessage value {:?} and type {:?}",
687 value, ty
688 ),
689 }
690 }
691}
692
693fn encode_packed_list<T, I, B, E, L>(number: u32, iter: I, buf: &mut B, encode: E, encoded_len: L)
694where
695 I: IntoIterator<Item = T> + Clone,
696 B: BufMut,
697 E: Fn(T, &mut B),
698 L: Fn(T) -> usize,
699{
700 prost::encoding::encode_key(number, WireType::LengthDelimited, buf);
701 let len: usize = iter.clone().into_iter().map(encoded_len).sum();
702 prost::encoding::encode_varint(len as u64, buf);
703
704 for value in iter {
705 encode(value, buf);
706 }
707}
708
709fn packed_list_encoded_len<T, I, L>(number: u32, iter: I, encoded_len: L) -> usize
710where
711 I: IntoIterator<Item = T>,
712 L: Fn(T) -> usize,
713{
714 let len: usize = iter.into_iter().map(encoded_len).sum();
715 prost::encoding::key_len(number) + prost::encoding::encoded_len_varint(len as u64) + len
716}
717
718fn from_sint32(value: i32) -> u32 {
719 ((value << 1) ^ (value >> 31)) as u32
720}
721fn from_sint64(value: i64) -> u64 {
725 ((value << 1) ^ (value >> 63)) as u64
726}
727