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}
715fn from_sint64(value: i64) -> u64 {
719 ((value << 1) ^ (value >> 63)) as u64
720}
721