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) => {
267                panic!("mismatch between DynamicMessage value {value:?} and type {ty:?}")
268            }
269        }
270    }
271
272    pub(super) fn merge_field<B>(
273        &mut self,
274        field_desc: &impl FieldDescriptorLike,
275        wire_type: WireType,
276        buf: &mut B,
277        ctx: DecodeContext,
278    ) -> Result<(), DecodeError>
279    where
280        B: Buf,
281    {
282        match (self, field_desc.kind()) {
283            (Value::Bool(value), Kind::Bool) => {
284                prost::encoding::bool::merge(wire_type, value, buf, ctx)
285            }
286            (Value::I32(value), Kind::Int32) => {
287                prost::encoding::int32::merge(wire_type, value, buf, ctx)
288            }
289            (Value::I32(value), Kind::Sint32) => {
290                prost::encoding::sint32::merge(wire_type, value, buf, ctx)
291            }
292            (Value::I32(value), Kind::Sfixed32) => {
293                prost::encoding::sfixed32::merge(wire_type, value, buf, ctx)
294            }
295            (Value::I64(value), Kind::Int64) => {
296                prost::encoding::int64::merge(wire_type, value, buf, ctx)
297            }
298            (Value::I64(value), Kind::Sint64) => {
299                prost::encoding::sint64::merge(wire_type, value, buf, ctx)
300            }
301            (Value::I64(value), Kind::Sfixed64) => {
302                prost::encoding::sfixed64::merge(wire_type, value, buf, ctx)
303            }
304            (Value::U32(value), Kind::Uint32) => {
305                prost::encoding::uint32::merge(wire_type, value, buf, ctx)
306            }
307            (Value::U32(value), Kind::Fixed32) => {
308                prost::encoding::fixed32::merge(wire_type, value, buf, ctx)
309            }
310            (Value::U64(value), Kind::Uint64) => {
311                prost::encoding::uint64::merge(wire_type, value, buf, ctx)
312            }
313            (Value::U64(value), Kind::Fixed64) => {
314                prost::encoding::fixed64::merge(wire_type, value, buf, ctx)
315            }
316            (Value::F32(value), Kind::Float) => {
317                prost::encoding::float::merge(wire_type, value, buf, ctx)
318            }
319            (Value::F64(value), Kind::Double) => {
320                prost::encoding::double::merge(wire_type, value, buf, ctx)
321            }
322            (Value::String(value), Kind::String) => {
323                prost::encoding::string::merge(wire_type, value, buf, ctx)
324            }
325            (Value::Bytes(value), Kind::Bytes) => {
326                prost::encoding::bytes::merge(wire_type, value, buf, ctx)
327            }
328            (Value::EnumNumber(value), Kind::Enum(_)) => {
329                prost::encoding::int32::merge(wire_type, value, buf, ctx)
330            }
331            (Value::Message(message), Kind::Message(_)) => {
332                if field_desc.is_group() {
333                    prost::encoding::group::merge(field_desc.number(), wire_type, message, buf, ctx)
334                } else {
335                    prost::encoding::message::merge(wire_type, message, buf, ctx)
336                }
337            }
338            (Value::List(values), field_kind) if field_desc.is_list() => {
339                if wire_type == WireType::LengthDelimited && field_desc.is_packable() {
340                    prost::encoding::merge_loop(values, buf, ctx, |values, buf, ctx| {
341                        let mut value = Value::default_value(&field_kind);
342                        value.merge_field(field_desc, field_kind.wire_type(), buf, ctx)?;
343                        values.push(value);
344                        Ok(())
345                    })
346                } else {
347                    let mut value = Value::default_value(&field_kind);
348                    value.merge_field(field_desc, wire_type, buf, ctx)?;
349                    values.push(value);
350                    Ok(())
351                }
352            }
353            (Value::Map(values), Kind::Message(map_entry)) if field_desc.is_map() => {
354                let key_desc = map_entry.get_field(MAP_ENTRY_KEY_NUMBER).unwrap();
355                let value_desc = map_entry.get_field(MAP_ENTRY_VALUE_NUMBER).unwrap();
356
357                let mut key = MapKey::default_value(&key_desc.kind());
358                let mut value = Value::default_value_for_field(&value_desc);
359                prost::encoding::merge_loop(
360                    &mut (&mut key, &mut value),
361                    buf,
362                    ctx,
363                    |(key, value), buf, ctx| {
364                        let (number, wire_type) = prost::encoding::decode_key(buf)?;
365                        match number {
366                            MAP_ENTRY_KEY_NUMBER => key.merge_field(&key_desc, wire_type, buf, ctx),
367                            MAP_ENTRY_VALUE_NUMBER => {
368                                value.merge_field(&value_desc, wire_type, buf, ctx)
369                            }
370                            _ => prost::encoding::skip_field(wire_type, number, buf, ctx),
371                        }
372                    },
373                )?;
374                values.insert(key, value);
375
376                Ok(())
377            }
378            (value, ty) => {
379                panic!("mismatch between DynamicMessage value {value:?} and type {ty:?}")
380            }
381        }
382    }
383
384    pub(super) fn encoded_len(&self, field_desc: &impl FieldDescriptorLike) -> usize {
385        if !field_desc.supports_presence() && field_desc.is_default_value(self) {
386            return 0;
387        }
388
389        let number = field_desc.number();
390        match (self, field_desc.kind()) {
391            (Value::Bool(value), Kind::Bool) => prost::encoding::bool::encoded_len(number, value),
392            (Value::I32(value), Kind::Int32) => prost::encoding::int32::encoded_len(number, value),
393            (Value::I32(value), Kind::Sint32) => {
394                prost::encoding::sint32::encoded_len(number, value)
395            }
396            (Value::I32(value), Kind::Sfixed32) => {
397                prost::encoding::sfixed32::encoded_len(number, value)
398            }
399            (Value::I64(value), Kind::Int64) => prost::encoding::int64::encoded_len(number, value),
400            (Value::I64(value), Kind::Sint64) => {
401                prost::encoding::sint64::encoded_len(number, value)
402            }
403            (Value::I64(value), Kind::Sfixed64) => {
404                prost::encoding::sfixed64::encoded_len(number, value)
405            }
406            (Value::U32(value), Kind::Uint32) => {
407                prost::encoding::uint32::encoded_len(number, value)
408            }
409            (Value::U32(value), Kind::Fixed32) => {
410                prost::encoding::fixed32::encoded_len(number, value)
411            }
412            (Value::U64(value), Kind::Uint64) => {
413                prost::encoding::uint64::encoded_len(number, value)
414            }
415            (Value::U64(value), Kind::Fixed64) => {
416                prost::encoding::fixed64::encoded_len(number, value)
417            }
418            (Value::F32(value), Kind::Float) => prost::encoding::float::encoded_len(number, value),
419            (Value::F64(value), Kind::Double) => {
420                prost::encoding::double::encoded_len(number, value)
421            }
422            (Value::String(value), Kind::String) => {
423                prost::encoding::string::encoded_len(number, value)
424            }
425            (Value::Bytes(value), Kind::Bytes) => {
426                prost::encoding::bytes::encoded_len(number, value)
427            }
428            (Value::EnumNumber(value), Kind::Enum(_)) => {
429                prost::encoding::int32::encoded_len(number, value)
430            }
431            (Value::Message(message), Kind::Message(_)) => {
432                if field_desc.is_group() {
433                    prost::encoding::group::encoded_len(number, message)
434                } else {
435                    prost::encoding::message::encoded_len(number, message)
436                }
437            }
438            (Value::List(values), _) if field_desc.is_list() => {
439                if field_desc.is_packed() {
440                    match field_desc.kind() {
441                        Kind::Enum(_) => packed_list_encoded_len(
442                            number,
443                            values
444                                .iter()
445                                .map(|v| v.as_enum_number().expect("expected enum number")),
446                            |v| prost::encoding::encoded_len_varint(v as u64),
447                        ),
448                        Kind::Double => packed_list_encoded_len(
449                            number,
450                            values.iter().map(|v| v.as_f64().expect("expected double")),
451                            |_| 8,
452                        ),
453                        Kind::Float => packed_list_encoded_len(
454                            number,
455                            values.iter().map(|v| v.as_f32().expect("expected float")),
456                            |_| 4,
457                        ),
458                        Kind::Int32 => packed_list_encoded_len(
459                            number,
460                            values.iter().map(|v| v.as_i32().expect("expected i32")),
461                            |v| prost::encoding::encoded_len_varint(v as u64),
462                        ),
463                        Kind::Int64 => packed_list_encoded_len(
464                            number,
465                            values.iter().map(|v| v.as_i64().expect("expected i64")),
466                            |v| prost::encoding::encoded_len_varint(v as u64),
467                        ),
468                        Kind::Uint32 => packed_list_encoded_len(
469                            number,
470                            values.iter().map(|v| v.as_u32().expect("expected u32")),
471                            |v| prost::encoding::encoded_len_varint(v as u64),
472                        ),
473                        Kind::Uint64 => packed_list_encoded_len(
474                            number,
475                            values.iter().map(|v| v.as_u64().expect("expected u64")),
476                            prost::encoding::encoded_len_varint,
477                        ),
478                        Kind::Sint32 => packed_list_encoded_len(
479                            number,
480                            values.iter().map(|v| v.as_i32().expect("expected i32")),
481                            |v| prost::encoding::encoded_len_varint(from_sint32(v) as u64),
482                        ),
483                        Kind::Sint64 => packed_list_encoded_len(
484                            number,
485                            values.iter().map(|v| v.as_i64().expect("expected i64")),
486                            |v| prost::encoding::encoded_len_varint(from_sint64(v)),
487                        ),
488                        Kind::Fixed32 => packed_list_encoded_len(
489                            number,
490                            values.iter().map(|v| v.as_u32().expect("expected u32")),
491                            |_| 4,
492                        ),
493                        Kind::Fixed64 => packed_list_encoded_len(
494                            number,
495                            values.iter().map(|v| v.as_u64().expect("expected u64")),
496                            |_| 8,
497                        ),
498                        Kind::Sfixed32 => packed_list_encoded_len(
499                            number,
500                            values.iter().map(|v| v.as_i32().expect("expected i32")),
501                            |_| 4,
502                        ),
503                        Kind::Sfixed64 => packed_list_encoded_len(
504                            number,
505                            values.iter().map(|v| v.as_i64().expect("expected i64")),
506                            |_| 8,
507                        ),
508                        Kind::Bool => packed_list_encoded_len(
509                            number,
510                            values.iter().map(|v| v.as_bool().expect("expected bool")),
511                            |v| prost::encoding::encoded_len_varint(v as u64),
512                        ),
513                        _ => panic!("invalid type for packed field in DynamicMessage"),
514                    }
515                } else {
516                    values
517                        .iter()
518                        .map(|value| value.encoded_len(field_desc))
519                        .sum()
520                }
521            }
522            (Value::Map(values), Kind::Message(map_entry)) if field_desc.is_map() => {
523                let key_desc = map_entry.map_entry_key_field();
524                let value_desc = map_entry.map_entry_value_field();
525
526                let key_len = prost::encoding::key_len(number);
527                values
528                    .iter()
529                    .map(|(key, value)| {
530                        let len = key.encoded_len(&key_desc) + value.encoded_len(&value_desc);
531
532                        key_len + prost::encoding::encoded_len_varint(len as u64) + len
533                    })
534                    .sum::<usize>()
535            }
536            (value, ty) => {
537                panic!("mismatch between DynamicMessage value {value:?} and type {ty:?}")
538            }
539        }
540    }
541}
542
543impl MapKey {
544    fn encode_field<B>(&self, field_desc: &FieldDescriptor, buf: &mut B)
545    where
546        B: BufMut,
547    {
548        if !field_desc.supports_presence() && self.is_default(&field_desc.kind()) {
549            return;
550        }
551
552        let number = field_desc.number();
553        match (self, field_desc.kind()) {
554            (MapKey::Bool(value), Kind::Bool) => prost::encoding::bool::encode(number, value, buf),
555            (MapKey::I32(value), Kind::Int32) => prost::encoding::int32::encode(number, value, buf),
556            (MapKey::I32(value), Kind::Sint32) => {
557                prost::encoding::sint32::encode(number, value, buf)
558            }
559            (MapKey::I32(value), Kind::Sfixed32) => {
560                prost::encoding::sfixed32::encode(number, value, buf)
561            }
562            (MapKey::I64(value), Kind::Int64) => prost::encoding::int64::encode(number, value, buf),
563            (MapKey::I64(value), Kind::Sint64) => {
564                prost::encoding::sint64::encode(number, value, buf)
565            }
566            (MapKey::I64(value), Kind::Sfixed64) => {
567                prost::encoding::sfixed64::encode(number, value, buf)
568            }
569            (MapKey::U32(value), Kind::Uint32) => {
570                prost::encoding::uint32::encode(number, value, buf)
571            }
572            (MapKey::U32(value), Kind::Fixed32) => {
573                prost::encoding::fixed32::encode(number, value, buf)
574            }
575            (MapKey::U64(value), Kind::Uint64) => {
576                prost::encoding::uint64::encode(number, value, buf)
577            }
578            (MapKey::U64(value), Kind::Fixed64) => {
579                prost::encoding::fixed64::encode(number, value, buf)
580            }
581            (MapKey::String(value), Kind::String) => {
582                prost::encoding::string::encode(number, value, buf)
583            }
584            (value, ty) => {
585                panic!("mismatch between DynamicMessage value {value:?} and type {ty:?}")
586            }
587        }
588    }
589
590    fn merge_field<B>(
591        &mut self,
592        field_desc: &FieldDescriptor,
593        wire_type: WireType,
594        buf: &mut B,
595        ctx: DecodeContext,
596    ) -> Result<(), DecodeError>
597    where
598        B: Buf,
599    {
600        match (self, field_desc.kind()) {
601            (MapKey::Bool(value), Kind::Bool) => {
602                prost::encoding::bool::merge(wire_type, value, buf, ctx)
603            }
604            (MapKey::I32(value), Kind::Int32) => {
605                prost::encoding::int32::merge(wire_type, value, buf, ctx)
606            }
607            (MapKey::I32(value), Kind::Sint32) => {
608                prost::encoding::sint32::merge(wire_type, value, buf, ctx)
609            }
610            (MapKey::I32(value), Kind::Sfixed32) => {
611                prost::encoding::sfixed32::merge(wire_type, value, buf, ctx)
612            }
613            (MapKey::I64(value), Kind::Int64) => {
614                prost::encoding::int64::merge(wire_type, value, buf, ctx)
615            }
616            (MapKey::I64(value), Kind::Sint64) => {
617                prost::encoding::sint64::merge(wire_type, value, buf, ctx)
618            }
619            (MapKey::I64(value), Kind::Sfixed64) => {
620                prost::encoding::sfixed64::merge(wire_type, value, buf, ctx)
621            }
622            (MapKey::U32(value), Kind::Uint32) => {
623                prost::encoding::uint32::merge(wire_type, value, buf, ctx)
624            }
625            (MapKey::U32(value), Kind::Fixed32) => {
626                prost::encoding::fixed32::merge(wire_type, value, buf, ctx)
627            }
628            (MapKey::U64(value), Kind::Uint64) => {
629                prost::encoding::uint64::merge(wire_type, value, buf, ctx)
630            }
631            (MapKey::U64(value), Kind::Fixed64) => {
632                prost::encoding::fixed64::merge(wire_type, value, buf, ctx)
633            }
634            (MapKey::String(value), Kind::String) => {
635                prost::encoding::string::merge(wire_type, value, buf, ctx)
636            }
637            (value, ty) => {
638                panic!("mismatch between DynamicMessage value {value:?} and type {ty:?}")
639            }
640        }
641    }
642
643    fn encoded_len(&self, field_desc: &FieldDescriptor) -> usize {
644        if !field_desc.supports_presence() && self.is_default(&field_desc.kind()) {
645            return 0;
646        }
647
648        let number = field_desc.number();
649        match (self, field_desc.kind()) {
650            (MapKey::Bool(value), Kind::Bool) => prost::encoding::bool::encoded_len(number, value),
651            (MapKey::I32(value), Kind::Int32) => prost::encoding::int32::encoded_len(number, value),
652            (MapKey::I32(value), Kind::Sint32) => {
653                prost::encoding::sint32::encoded_len(number, value)
654            }
655            (MapKey::I32(value), Kind::Sfixed32) => {
656                prost::encoding::sfixed32::encoded_len(number, value)
657            }
658            (MapKey::I64(value), Kind::Int64) => prost::encoding::int64::encoded_len(number, value),
659            (MapKey::I64(value), Kind::Sint64) => {
660                prost::encoding::sint64::encoded_len(number, value)
661            }
662            (MapKey::I64(value), Kind::Sfixed64) => {
663                prost::encoding::sfixed64::encoded_len(number, value)
664            }
665            (MapKey::U32(value), Kind::Uint32) => {
666                prost::encoding::uint32::encoded_len(number, value)
667            }
668            (MapKey::U32(value), Kind::Fixed32) => {
669                prost::encoding::fixed32::encoded_len(number, value)
670            }
671            (MapKey::U64(value), Kind::Uint64) => {
672                prost::encoding::uint64::encoded_len(number, value)
673            }
674            (MapKey::U64(value), Kind::Fixed64) => {
675                prost::encoding::fixed64::encoded_len(number, value)
676            }
677            (MapKey::String(value), Kind::String) => {
678                prost::encoding::string::encoded_len(number, value)
679            }
680            (value, ty) => {
681                panic!("mismatch between DynamicMessage value {value:?} and type {ty:?}")
682            }
683        }
684    }
685}
686
687fn encode_packed_list<T, I, B, E, L>(number: u32, iter: I, buf: &mut B, encode: E, encoded_len: L)
688where
689    I: IntoIterator<Item = T> + Clone,
690    B: BufMut,
691    E: Fn(T, &mut B),
692    L: Fn(T) -> usize,
693{
694    prost::encoding::encode_key(number, WireType::LengthDelimited, buf);
695    let len: usize = iter.clone().into_iter().map(encoded_len).sum();
696    prost::encoding::encode_varint(len as u64, buf);
697
698    for value in iter {
699        encode(value, buf);
700    }
701}
702
703fn packed_list_encoded_len<T, I, L>(number: u32, iter: I, encoded_len: L) -> usize
704where
705    I: IntoIterator<Item = T>,
706    L: Fn(T) -> usize,
707{
708    let len: usize = iter.into_iter().map(encoded_len).sum();
709    prost::encoding::key_len(number) + prost::encoding::encoded_len_varint(len as u64) + len
710}
711
712fn from_sint32(value: i32) -> u32 {
713    ((value << 1) ^ (value >> 31)) as u32
714}
715// fn to_sint32(value: u32) -> i32 {
716//     ((value >> 1) as i32) ^ (-((value & 1) as i32))
717// }
718fn from_sint64(value: i64) -> u64 {
719    ((value << 1) ^ (value >> 63)) as u64
720}
721// fn to_sint64(value: u64) -> i64 {
722//     ((value >> 1) as i64) ^ (-((value & 1) as i64))
723// }