prost_reflect/dynamic/
message.rs

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}
721// fn to_sint32(value: u32) -> i32 {
722//     ((value >> 1) as i32) ^ (-((value & 1) as i32))
723// }
724fn from_sint64(value: i64) -> u64 {
725    ((value << 1) ^ (value >> 63)) as u64
726}
727// fn to_sint64(value: u64) -> i64 {
728//     ((value >> 1) as i64) ^ (-((value & 1) as i64))
729// }