1use core::marker::PhantomData;
74
75use crate::unknown_fields::UnknownFields;
76
77#[derive(Debug)]
88pub struct Extension<C: ExtensionCodec> {
89 number: u32,
90 extendee: &'static str,
98 default: Option<fn() -> C::Value>,
99 _codec: PhantomData<fn() -> C>,
100}
101
102impl<C: ExtensionCodec> Extension<C> {
103 pub const fn new(number: u32, extendee: &'static str) -> Self {
116 Self {
117 number,
118 extendee,
119 default: None,
120 _codec: PhantomData,
121 }
122 }
123
124 pub const fn with_default(
135 number: u32,
136 extendee: &'static str,
137 default: fn() -> C::Value,
138 ) -> Self {
139 Self {
140 number,
141 extendee,
142 default: Some(default),
143 _codec: PhantomData,
144 }
145 }
146
147 pub const fn number(&self) -> u32 {
149 self.number
150 }
151
152 pub const fn extendee(&self) -> &'static str {
154 self.extendee
155 }
156}
157
158#[track_caller]
165#[inline]
166fn assert_extendee<C: ExtensionCodec>(ext: &Extension<C>, expected: &'static str) {
167 assert_eq!(
168 ext.extendee, expected,
169 "extension at field {} extends `{}`, not `{}`",
170 ext.number, ext.extendee, expected
171 );
172}
173
174impl<C: ExtensionCodec> Clone for Extension<C> {
178 fn clone(&self) -> Self {
179 *self
180 }
181}
182impl<C: ExtensionCodec> Copy for Extension<C> {}
183
184pub trait ExtensionCodec {
188 type Value;
190 type Output;
192
193 fn decode(number: u32, fields: &UnknownFields) -> Self::Output;
195
196 fn encode(number: u32, value: Self::Value, fields: &mut UnknownFields);
201}
202
203pub trait ExtensionSet {
212 const PROTO_FQN: &'static str;
219
220 fn unknown_fields(&self) -> &UnknownFields;
222 fn unknown_fields_mut(&mut self) -> &mut UnknownFields;
224
225 #[track_caller]
234 fn extension<C: ExtensionCodec>(&self, ext: &Extension<C>) -> C::Output {
235 assert_extendee(ext, Self::PROTO_FQN);
236 C::decode(ext.number, self.unknown_fields())
237 }
238
239 #[track_caller]
245 fn set_extension<C: ExtensionCodec>(&mut self, ext: &Extension<C>, value: C::Value) {
246 assert_extendee(ext, Self::PROTO_FQN);
247 self.unknown_fields_mut().retain(|f| f.number != ext.number);
248 C::encode(ext.number, value, self.unknown_fields_mut());
249 }
250
251 fn has_extension<C: ExtensionCodec>(&self, ext: &Extension<C>) -> bool {
259 if ext.extendee != Self::PROTO_FQN {
260 return false;
261 }
262 self.unknown_fields().iter().any(|f| f.number == ext.number)
263 }
264
265 #[track_caller]
271 fn clear_extension<C: ExtensionCodec>(&mut self, ext: &Extension<C>) {
272 assert_extendee(ext, Self::PROTO_FQN);
273 self.unknown_fields_mut().retain(|f| f.number != ext.number);
274 }
275
276 #[must_use]
291 #[track_caller]
292 fn extension_or_default<C>(&self, ext: &Extension<C>) -> C::Value
293 where
294 C: ExtensionCodec<Output = Option<<C as ExtensionCodec>::Value>>,
295 C::Value: Default,
296 {
297 self.extension(ext)
298 .or_else(|| ext.default.map(|f| f()))
299 .unwrap_or_default()
300 }
301}
302
303pub mod codecs {
310 use core::marker::PhantomData;
311
312 use alloc::string::String;
313 use alloc::vec::Vec;
314 use bytes::Buf;
315
316 use crate::encoding::{decode_varint, encode_varint};
317 use crate::message::Message;
318 use crate::types::{
319 zigzag_decode_i32, zigzag_decode_i64, zigzag_encode_i32, zigzag_encode_i64,
320 };
321 use crate::unknown_fields::{UnknownField, UnknownFieldData, UnknownFields};
322
323 use super::ExtensionCodec;
324
325 pub trait SingularCodec {
332 type Value;
333
334 fn decode_one(data: &UnknownFieldData) -> Option<Self::Value>;
339
340 fn decode_packed(bytes: &[u8], out: &mut Vec<Self::Value>);
349
350 fn encode_one(value: &Self::Value) -> UnknownFieldData;
352 }
353
354 pub trait PackableCodec: SingularCodec {
360 fn encode_packed(value: &Self::Value, buf: &mut Vec<u8>);
362 }
363
364 macro_rules! varint_codec {
369 ($name:ident, $ty:ty, |$d:ident| $decode:expr, |$e:ident| $encode:expr $(,)?) => {
370 #[doc = concat!("Codec for the `", stringify!($name), "` proto scalar type.")]
371 pub struct $name;
372
373 impl ExtensionCodec for $name {
374 type Value = $ty;
375 type Output = Option<$ty>;
376 fn decode(number: u32, fields: &UnknownFields) -> Option<$ty> {
377 fields
378 .iter()
379 .rev()
380 .filter(|f| f.number == number)
381 .find_map(|f| Self::decode_one(&f.data))
382 }
383 fn encode(number: u32, value: $ty, fields: &mut UnknownFields) {
384 fields.push(UnknownField {
385 number,
386 data: Self::encode_one(&value),
387 });
388 }
389 }
390
391 impl SingularCodec for $name {
392 type Value = $ty;
393 fn decode_one(data: &UnknownFieldData) -> Option<$ty> {
394 match *data {
395 UnknownFieldData::Varint($d) => Some($decode),
396 _ => None,
397 }
398 }
399 fn decode_packed(bytes: &[u8], out: &mut Vec<$ty>) {
400 let mut buf = bytes;
401 while buf.has_remaining() {
402 match decode_varint(&mut buf) {
403 Ok($d) => out.push($decode),
404 Err(_) => return,
405 }
406 }
407 }
408 fn encode_one($e: &$ty) -> UnknownFieldData {
409 let $e = *$e;
410 UnknownFieldData::Varint($encode)
411 }
412 }
413
414 impl PackableCodec for $name {
415 fn encode_packed($e: &$ty, buf: &mut Vec<u8>) {
416 let $e = *$e;
417 encode_varint($encode, buf);
418 }
419 }
420 };
421 }
422
423 varint_codec!(Int32, i32, |v| v as i32, |v| v as i64 as u64);
427 varint_codec!(Int64, i64, |v| v as i64, |v| v as u64);
428 varint_codec!(Uint32, u32, |v| v as u32, |v| v as u64);
429 varint_codec!(Uint64, u64, |v| v, |v| v);
430 varint_codec!(
431 Sint32,
432 i32,
433 |v| zigzag_decode_i32(v as u32),
434 |v| zigzag_encode_i32(v) as u64
435 );
436 varint_codec!(
437 Sint64,
438 i64,
439 |v| zigzag_decode_i64(v),
440 |v| zigzag_encode_i64(v)
441 );
442 varint_codec!(Bool, bool, |v| v != 0, |v| v as u64);
443 pub struct EnumI32;
448 impl ExtensionCodec for EnumI32 {
450 type Value = i32;
451 type Output = Option<i32>;
452 fn decode(number: u32, fields: &UnknownFields) -> Option<i32> {
453 Int32::decode(number, fields)
454 }
455 fn encode(number: u32, value: i32, fields: &mut UnknownFields) {
456 Int32::encode(number, value, fields)
457 }
458 }
459 impl SingularCodec for EnumI32 {
460 type Value = i32;
461 fn decode_one(data: &UnknownFieldData) -> Option<i32> {
462 Int32::decode_one(data)
463 }
464 fn decode_packed(bytes: &[u8], out: &mut Vec<i32>) {
465 Int32::decode_packed(bytes, out)
466 }
467 fn encode_one(value: &i32) -> UnknownFieldData {
468 Int32::encode_one(value)
469 }
470 }
471 impl PackableCodec for EnumI32 {
472 fn encode_packed(value: &i32, buf: &mut Vec<u8>) {
473 Int32::encode_packed(value, buf)
474 }
475 }
476
477 macro_rules! fixed32_codec {
482 ($name:ident, $ty:ty, |$d:ident| $decode:expr, |$e:ident| $encode:expr $(,)?) => {
483 #[doc = concat!("Codec for the `", stringify!($name), "` proto scalar type.")]
484 pub struct $name;
485
486 impl ExtensionCodec for $name {
487 type Value = $ty;
488 type Output = Option<$ty>;
489 fn decode(number: u32, fields: &UnknownFields) -> Option<$ty> {
490 fields
491 .iter()
492 .rev()
493 .filter(|f| f.number == number)
494 .find_map(|f| Self::decode_one(&f.data))
495 }
496 fn encode(number: u32, value: $ty, fields: &mut UnknownFields) {
497 fields.push(UnknownField {
498 number,
499 data: Self::encode_one(&value),
500 });
501 }
502 }
503
504 impl SingularCodec for $name {
505 type Value = $ty;
506 fn decode_one(data: &UnknownFieldData) -> Option<$ty> {
507 match *data {
508 UnknownFieldData::Fixed32($d) => Some($decode),
509 _ => None,
510 }
511 }
512 fn decode_packed(bytes: &[u8], out: &mut Vec<$ty>) {
513 let mut buf = bytes;
514 while buf.remaining() >= 4 {
515 let $d = buf.get_u32_le();
516 out.push($decode);
517 }
518 }
519 fn encode_one($e: &$ty) -> UnknownFieldData {
520 let $e = *$e;
521 UnknownFieldData::Fixed32($encode)
522 }
523 }
524
525 impl PackableCodec for $name {
526 fn encode_packed($e: &$ty, buf: &mut Vec<u8>) {
527 use bytes::BufMut;
528 let $e = *$e;
529 buf.put_u32_le($encode);
530 }
531 }
532 };
533 }
534
535 macro_rules! fixed64_codec {
536 ($name:ident, $ty:ty, |$d:ident| $decode:expr, |$e:ident| $encode:expr $(,)?) => {
537 #[doc = concat!("Codec for the `", stringify!($name), "` proto scalar type.")]
538 pub struct $name;
539
540 impl ExtensionCodec for $name {
541 type Value = $ty;
542 type Output = Option<$ty>;
543 fn decode(number: u32, fields: &UnknownFields) -> Option<$ty> {
544 fields
545 .iter()
546 .rev()
547 .filter(|f| f.number == number)
548 .find_map(|f| Self::decode_one(&f.data))
549 }
550 fn encode(number: u32, value: $ty, fields: &mut UnknownFields) {
551 fields.push(UnknownField {
552 number,
553 data: Self::encode_one(&value),
554 });
555 }
556 }
557
558 impl SingularCodec for $name {
559 type Value = $ty;
560 fn decode_one(data: &UnknownFieldData) -> Option<$ty> {
561 match *data {
562 UnknownFieldData::Fixed64($d) => Some($decode),
563 _ => None,
564 }
565 }
566 fn decode_packed(bytes: &[u8], out: &mut Vec<$ty>) {
567 let mut buf = bytes;
568 while buf.remaining() >= 8 {
569 let $d = buf.get_u64_le();
570 out.push($decode);
571 }
572 }
573 fn encode_one($e: &$ty) -> UnknownFieldData {
574 let $e = *$e;
575 UnknownFieldData::Fixed64($encode)
576 }
577 }
578
579 impl PackableCodec for $name {
580 fn encode_packed($e: &$ty, buf: &mut Vec<u8>) {
581 use bytes::BufMut;
582 let $e = *$e;
583 buf.put_u64_le($encode);
584 }
585 }
586 };
587 }
588
589 fixed32_codec!(Fixed32, u32, |v| v, |v| v);
590 fixed32_codec!(Sfixed32, i32, |v| v as i32, |v| v as u32);
591 fixed32_codec!(Float, f32, |v| f32::from_bits(v), |v| v.to_bits());
592 fixed64_codec!(Fixed64, u64, |v| v, |v| v);
593 fixed64_codec!(Sfixed64, i64, |v| v as i64, |v| v as u64);
594 fixed64_codec!(Double, f64, |v| f64::from_bits(v), |v| v.to_bits());
595
596 pub struct StringCodec;
602
603 impl ExtensionCodec for StringCodec {
604 type Value = String;
605 type Output = Option<String>;
606 fn decode(number: u32, fields: &UnknownFields) -> Option<String> {
607 fields
608 .iter()
609 .rev()
610 .filter(|f| f.number == number)
611 .find_map(|f| Self::decode_one(&f.data))
612 }
613 fn encode(number: u32, value: String, fields: &mut UnknownFields) {
614 fields.push(UnknownField {
615 number,
616 data: UnknownFieldData::LengthDelimited(value.into_bytes()),
617 });
618 }
619 }
620
621 impl SingularCodec for StringCodec {
622 type Value = String;
623 fn decode_one(data: &UnknownFieldData) -> Option<String> {
624 match data {
625 UnknownFieldData::LengthDelimited(bytes) => String::from_utf8(bytes.clone()).ok(),
626 _ => None,
627 }
628 }
629 fn decode_packed(_bytes: &[u8], _out: &mut Vec<String>) {}
630 fn encode_one(value: &String) -> UnknownFieldData {
631 UnknownFieldData::LengthDelimited(value.clone().into_bytes())
632 }
633 }
634
635 pub struct BytesCodec;
637
638 impl ExtensionCodec for BytesCodec {
639 type Value = Vec<u8>;
640 type Output = Option<Vec<u8>>;
641 fn decode(number: u32, fields: &UnknownFields) -> Option<Vec<u8>> {
642 fields
643 .iter()
644 .rev()
645 .filter(|f| f.number == number)
646 .find_map(|f| Self::decode_one(&f.data))
647 }
648 fn encode(number: u32, value: Vec<u8>, fields: &mut UnknownFields) {
649 fields.push(UnknownField {
650 number,
651 data: UnknownFieldData::LengthDelimited(value),
652 });
653 }
654 }
655
656 impl SingularCodec for BytesCodec {
657 type Value = Vec<u8>;
658 fn decode_one(data: &UnknownFieldData) -> Option<Vec<u8>> {
659 match data {
660 UnknownFieldData::LengthDelimited(bytes) => Some(bytes.clone()),
661 _ => None,
662 }
663 }
664 fn decode_packed(_bytes: &[u8], _out: &mut Vec<Vec<u8>>) {}
665 fn encode_one(value: &Vec<u8>) -> UnknownFieldData {
666 UnknownFieldData::LengthDelimited(value.clone())
667 }
668 }
669
670 pub struct MessageCodec<M>(PhantomData<fn() -> M>);
676
677 impl<M: Message + Default> ExtensionCodec for MessageCodec<M> {
678 type Value = M;
679 type Output = Option<M>;
680 fn decode(number: u32, fields: &UnknownFields) -> Option<M> {
681 let mut msg: Option<M> = None;
682 for f in fields.iter().filter(|f| f.number == number) {
683 if let UnknownFieldData::LengthDelimited(bytes) = &f.data {
684 let m = msg.get_or_insert_with(M::default);
685 if m.merge_from_slice(bytes).is_err() {
686 return None;
687 }
688 }
689 }
690 msg
691 }
692 fn encode(number: u32, value: M, fields: &mut UnknownFields) {
693 fields.push(UnknownField {
694 number,
695 data: UnknownFieldData::LengthDelimited(value.encode_to_vec()),
696 });
697 }
698 }
699
700 impl<M: Message + Default> SingularCodec for MessageCodec<M> {
701 type Value = M;
702 fn decode_one(data: &UnknownFieldData) -> Option<M> {
703 match data {
704 UnknownFieldData::LengthDelimited(bytes) => {
705 let mut m = M::default();
706 m.merge_from_slice(bytes).ok()?;
707 Some(m)
708 }
709 _ => None,
710 }
711 }
712 fn decode_packed(_bytes: &[u8], _out: &mut Vec<M>) {}
713 fn encode_one(value: &M) -> UnknownFieldData {
714 UnknownFieldData::LengthDelimited(value.encode_to_vec())
715 }
716 }
717
718 pub struct GroupCodec<M>(PhantomData<fn() -> M>);
735
736 impl<M: Message + Default> ExtensionCodec for GroupCodec<M> {
737 type Value = M;
738 type Output = Option<M>;
739 fn decode(number: u32, fields: &UnknownFields) -> Option<M> {
740 let mut msg: Option<M> = None;
741 for f in fields.iter().filter(|f| f.number == number) {
742 if let UnknownFieldData::Group(inner) = &f.data {
743 let m = msg.get_or_insert_with(M::default);
744 let mut buf = Vec::with_capacity(inner.encoded_len());
745 inner.write_to(&mut buf);
746 if m.merge_from_slice(&buf).is_err() {
747 return None;
748 }
749 }
750 }
751 msg
752 }
753 fn encode(number: u32, value: M, fields: &mut UnknownFields) {
754 let bytes = value.encode_to_vec();
755 let inner = UnknownFields::decode_from_slice(&bytes)
758 .expect("BUG: re-decoding freshly-encoded message bytes failed");
759 fields.push(UnknownField {
760 number,
761 data: UnknownFieldData::Group(inner),
762 });
763 }
764 }
765
766 impl<M: Message + Default> SingularCodec for GroupCodec<M> {
767 type Value = M;
768 fn decode_one(data: &UnknownFieldData) -> Option<M> {
769 match data {
770 UnknownFieldData::Group(inner) => {
771 let mut buf = Vec::with_capacity(inner.encoded_len());
772 inner.write_to(&mut buf);
773 let mut m = M::default();
774 m.merge_from_slice(&buf).ok()?;
775 Some(m)
776 }
777 _ => None,
778 }
779 }
780 fn decode_packed(_bytes: &[u8], _out: &mut Vec<M>) {}
783 fn encode_one(value: &M) -> UnknownFieldData {
784 let bytes = value.encode_to_vec();
785 let inner = UnknownFields::decode_from_slice(&bytes)
787 .expect("BUG: re-decoding freshly-encoded message bytes failed");
788 UnknownFieldData::Group(inner)
789 }
790 }
791
792 pub struct Repeated<C>(PhantomData<fn() -> C>);
802
803 impl<C: SingularCodec> ExtensionCodec for Repeated<C> {
804 type Value = Vec<C::Value>;
805 type Output = Vec<C::Value>;
806 fn decode(number: u32, fields: &UnknownFields) -> Vec<C::Value> {
807 decode_repeated::<C>(number, fields)
808 }
809 fn encode(number: u32, value: Vec<C::Value>, fields: &mut UnknownFields) {
810 for v in &value {
811 fields.push(UnknownField {
812 number,
813 data: C::encode_one(v),
814 });
815 }
816 }
817 }
818
819 pub struct PackedRepeated<C>(PhantomData<fn() -> C>);
830
831 impl<C: PackableCodec> ExtensionCodec for PackedRepeated<C> {
832 type Value = Vec<C::Value>;
833 type Output = Vec<C::Value>;
834 fn decode(number: u32, fields: &UnknownFields) -> Vec<C::Value> {
835 decode_repeated::<C>(number, fields)
836 }
837 fn encode(number: u32, value: Vec<C::Value>, fields: &mut UnknownFields) {
838 if value.is_empty() {
839 return;
840 }
841 let mut buf = Vec::new();
842 for v in &value {
843 C::encode_packed(v, &mut buf);
844 }
845 fields.push(UnknownField {
846 number,
847 data: UnknownFieldData::LengthDelimited(buf),
848 });
849 }
850 }
851
852 fn decode_repeated<C: SingularCodec>(number: u32, fields: &UnknownFields) -> Vec<C::Value> {
855 let mut out = Vec::new();
856 for f in fields.iter().filter(|f| f.number == number) {
857 if let Some(v) = C::decode_one(&f.data) {
858 out.push(v);
859 } else if let UnknownFieldData::LengthDelimited(bytes) = &f.data {
860 C::decode_packed(bytes, &mut out);
861 }
862 }
863 out
864 }
865}
866
867#[cfg(test)]
872mod tests {
873 use super::codecs::*;
874 use super::*;
875 use crate::unknown_fields::{UnknownField, UnknownFieldData};
876 use alloc::string::{String, ToString};
877 use alloc::{vec, vec::Vec};
878
879 const CARRIER: &str = "test.Carrier";
883
884 #[derive(Default)]
885 struct Carrier {
886 unknown: UnknownFields,
887 }
888 impl ExtensionSet for Carrier {
889 const PROTO_FQN: &'static str = CARRIER;
890 fn unknown_fields(&self) -> &UnknownFields {
891 &self.unknown
892 }
893 fn unknown_fields_mut(&mut self) -> &mut UnknownFields {
894 &mut self.unknown
895 }
896 }
897
898 fn varint(number: u32, v: u64) -> UnknownField {
899 UnknownField {
900 number,
901 data: UnknownFieldData::Varint(v),
902 }
903 }
904 fn fixed32(number: u32, v: u32) -> UnknownField {
905 UnknownField {
906 number,
907 data: UnknownFieldData::Fixed32(v),
908 }
909 }
910 fn fixed64(number: u32, v: u64) -> UnknownField {
911 UnknownField {
912 number,
913 data: UnknownFieldData::Fixed64(v),
914 }
915 }
916 fn ld(number: u32, data: Vec<u8>) -> UnknownField {
917 UnknownField {
918 number,
919 data: UnknownFieldData::LengthDelimited(data),
920 }
921 }
922 fn group(number: u32, inner: UnknownFields) -> UnknownField {
923 UnknownField {
924 number,
925 data: UnknownFieldData::Group(inner),
926 }
927 }
928
929 #[test]
932 fn extension_const_fn() {
933 const EXT: Extension<Int32> = Extension::new(50001, CARRIER);
934 assert_eq!(EXT.number(), 50001);
935 assert_eq!(EXT.extendee(), CARRIER);
936 let copy = EXT; assert_eq!(copy.number(), 50001);
938 }
939
940 #[test]
941 fn extension_with_default_const_fn() {
942 const fn seven() -> i32 {
945 7
946 }
947 const E: Extension<Int32> = Extension::with_default(1, CARRIER, seven);
948 assert_eq!(E.number(), 1);
949 assert_eq!(E.extendee(), CARRIER);
950 let copy = E; assert_eq!(copy.number(), 1);
952 }
953
954 const WRONG: Extension<Int32> = Extension::new(1, "other.Message");
959
960 #[test]
961 #[should_panic(expected = "extends `other.Message`, not `test.Carrier`")]
962 fn extension_panics_on_extendee_mismatch() {
963 let c = Carrier::default();
964 let _ = c.extension(&WRONG);
965 }
966
967 #[test]
968 #[should_panic(expected = "extends `other.Message`, not `test.Carrier`")]
969 fn set_extension_panics_on_extendee_mismatch() {
970 let mut c = Carrier::default();
971 c.set_extension(&WRONG, 42);
972 }
973
974 #[test]
975 #[should_panic(expected = "extends `other.Message`, not `test.Carrier`")]
976 fn clear_extension_panics_on_extendee_mismatch() {
977 let mut c = Carrier::default();
978 c.clear_extension(&WRONG);
979 }
980
981 #[test]
982 #[should_panic(expected = "extends `other.Message`, not `test.Carrier`")]
983 fn extension_or_default_panics_on_extendee_mismatch() {
984 let c = Carrier::default();
986 let _ = c.extension_or_default(&WRONG);
987 }
988
989 #[test]
990 fn has_extension_returns_false_on_extendee_mismatch() {
991 let mut c = Carrier::default();
996 c.unknown.push(varint(1, 42));
998 assert!(!c.has_extension(&WRONG));
999 const RIGHT: Extension<Int32> = Extension::new(1, CARRIER);
1001 assert!(c.has_extension(&RIGHT));
1002 }
1003
1004 #[test]
1007 fn extension_or_default_returns_declared_default_when_absent() {
1008 const fn seven() -> i32 {
1009 7
1010 }
1011 const E: Extension<Int32> = Extension::with_default(1, CARRIER, seven);
1012 let c = Carrier::default();
1013 assert_eq!(c.extension(&E), None);
1015 assert!(!c.has_extension(&E));
1016 assert_eq!(c.extension_or_default(&E), 7);
1018 }
1019
1020 #[test]
1021 fn extension_or_default_set_value_wins() {
1022 const fn seven() -> i32 {
1023 7
1024 }
1025 const E: Extension<Int32> = Extension::with_default(1, CARRIER, seven);
1026 let mut c = Carrier::default();
1027 c.set_extension(&E, 99);
1028 assert_eq!(c.extension_or_default(&E), 99);
1030 assert_eq!(c.extension(&E), Some(99));
1031 }
1032
1033 #[test]
1034 fn extension_or_default_falls_back_to_type_default() {
1035 const E: Extension<Int32> = Extension::new(1, CARRIER);
1037 let c = Carrier::default();
1038 assert_eq!(c.extension_or_default(&E), 0);
1039 assert_eq!(c.extension(&E), None);
1040 }
1041
1042 #[test]
1043 fn extension_or_default_string_allocates_per_call() {
1044 fn hello() -> String {
1046 String::from("hello")
1047 }
1048 const E: Extension<StringCodec> = Extension::with_default(1, CARRIER, hello);
1049 let c = Carrier::default();
1050 assert_eq!(c.extension_or_default(&E), "hello");
1051 let a = c.extension_or_default(&E);
1053 let b = c.extension_or_default(&E);
1054 assert_eq!(a, b);
1055 assert_ne!(a.as_ptr(), b.as_ptr());
1056 }
1057
1058 #[test]
1059 fn extension_or_default_bytes() {
1060 fn blob() -> Vec<u8> {
1061 alloc::vec![0xDE, 0xAD]
1062 }
1063 const E: Extension<BytesCodec> = Extension::with_default(1, CARRIER, blob);
1064 let c = Carrier::default();
1065 assert_eq!(c.extension_or_default(&E), alloc::vec![0xDE, 0xAD]);
1066 }
1067
1068 #[test]
1069 fn extension_or_default_zero_is_present_not_default() {
1070 const fn seven() -> i32 {
1072 7
1073 }
1074 const E: Extension<Int32> = Extension::with_default(1, CARRIER, seven);
1075 let mut c = Carrier::default();
1076 c.set_extension(&E, 0);
1077 assert_eq!(c.extension_or_default(&E), 0);
1078 }
1079
1080 #[test]
1083 fn singular_scalar_roundtrip() {
1084 #[rustfmt::skip]
1087 let int32_cases: &[(i32, u64)] = &[
1088 (0, 0),
1089 (42, 42),
1090 (-7, (-7_i64) as u64),
1091 ];
1092 for &(v, wire) in int32_cases {
1093 let mut c = Carrier::default();
1094 const E: Extension<Int32> = Extension::new(1, CARRIER);
1095 c.set_extension(&E, v);
1096 assert_eq!(
1097 c.unknown.iter().next().unwrap().data,
1098 UnknownFieldData::Varint(wire),
1099 "int32 {v}"
1100 );
1101 assert_eq!(c.extension(&E), Some(v), "int32 {v}");
1102 }
1103
1104 #[rustfmt::skip]
1106 let sint32_cases: &[(i32, u64)] = &[
1107 (0, 0),
1108 (-1, 1),
1109 (1, 2),
1110 (-2, 3),
1111 ];
1112 for &(v, wire) in sint32_cases {
1113 let mut c = Carrier::default();
1114 const E: Extension<Sint32> = Extension::new(1, CARRIER);
1115 c.set_extension(&E, v);
1116 assert_eq!(
1117 c.unknown.iter().next().unwrap().data,
1118 UnknownFieldData::Varint(wire),
1119 "sint32 {v}"
1120 );
1121 assert_eq!(c.extension(&E), Some(v), "sint32 {v}");
1122 }
1123
1124 let mut c = Carrier::default();
1126 const SF32: Extension<Sfixed32> = Extension::new(1, CARRIER);
1127 c.set_extension(&SF32, -1);
1128 assert_eq!(
1129 c.unknown.iter().next().unwrap().data,
1130 UnknownFieldData::Fixed32(u32::MAX)
1131 );
1132 assert_eq!(c.extension(&SF32), Some(-1));
1133
1134 const B: Extension<Bool> = Extension::new(1, CARRIER);
1136 let mut c = Carrier::default();
1137 c.unknown.push(varint(1, 7));
1138 assert_eq!(c.extension(&B), Some(true));
1139 let mut c = Carrier::default();
1140 c.set_extension(&B, true);
1141 assert_eq!(
1142 c.unknown.iter().next().unwrap().data,
1143 UnknownFieldData::Varint(1)
1144 );
1145
1146 const F: Extension<Float> = Extension::new(1, CARRIER);
1148 let mut c = Carrier::default();
1149 c.set_extension(&F, 1.5_f32);
1150 assert_eq!(c.extension(&F), Some(1.5_f32));
1151 const D: Extension<Double> = Extension::new(2, CARRIER);
1152 c.set_extension(&D, -0.25_f64);
1153 assert_eq!(c.extension(&D), Some(-0.25_f64));
1154
1155 const U: Extension<Uint32> = Extension::new(1, CARRIER);
1157 let mut c = Carrier::default();
1158 c.unknown.push(varint(1, 0x1_0000_002A)); assert_eq!(c.extension(&U), Some(0x0000_002A));
1160 }
1161
1162 #[test]
1163 fn singular_scalar_last_wins() {
1164 const E: Extension<Int32> = Extension::new(1, CARRIER);
1165 let mut c = Carrier::default();
1166 c.unknown.push(varint(1, 5));
1167 c.unknown.push(varint(1, 7));
1168 assert_eq!(c.extension(&E), Some(7));
1169 }
1170
1171 #[test]
1172 fn singular_scalar_wrong_wire_type_skipped() {
1173 const E: Extension<Int32> = Extension::new(1, CARRIER);
1174 let mut c = Carrier::default();
1175 c.unknown.push(varint(1, 5));
1176 c.unknown.push(ld(1, vec![0x00])); assert_eq!(c.extension(&E), Some(5));
1178
1179 let mut c = Carrier::default();
1181 c.unknown.push(ld(1, vec![0x00]));
1182 assert_eq!(c.extension(&E), None);
1183 }
1184
1185 #[test]
1186 fn singular_absent_returns_none() {
1187 const E: Extension<Int32> = Extension::new(1, CARRIER);
1188 let c = Carrier::default();
1189 assert_eq!(c.extension(&E), None);
1190 let mut c = Carrier::default();
1192 c.unknown.push(varint(2, 5));
1193 assert_eq!(c.extension(&E), None);
1194 }
1195
1196 #[test]
1199 fn explicit_presence_with_zero_value() {
1200 const E: Extension<Int32> = Extension::new(1, CARRIER);
1202 let mut c = Carrier::default();
1203 assert!(!c.has_extension(&E));
1204 c.set_extension(&E, 0);
1205 assert!(c.has_extension(&E));
1206 assert_eq!(c.extension(&E), Some(0));
1207 }
1208
1209 #[test]
1212 fn set_clears_prior_occurrences() {
1213 const E: Extension<Int32> = Extension::new(1, CARRIER);
1214 let mut c = Carrier::default();
1215 c.set_extension(&E, 5);
1216 c.set_extension(&E, 7);
1217 assert_eq!(c.unknown.iter().filter(|f| f.number == 1).count(), 1);
1219 assert_eq!(c.extension(&E), Some(7));
1220 }
1221
1222 #[test]
1223 fn set_preserves_other_fields() {
1224 const E: Extension<Int32> = Extension::new(1, CARRIER);
1225 let mut c = Carrier::default();
1226 c.unknown.push(varint(2, 99));
1227 c.set_extension(&E, 5);
1228 assert_eq!(c.unknown.len(), 2);
1229 assert!(c.unknown.iter().any(|f| f.number == 2));
1231 }
1232
1233 #[test]
1234 fn clear_extension() {
1235 const E: Extension<Int32> = Extension::new(1, CARRIER);
1236 let mut c = Carrier::default();
1237 c.set_extension(&E, 5);
1238 c.unknown.push(varint(2, 99));
1239 c.clear_extension(&E);
1240 assert!(!c.has_extension(&E));
1241 assert_eq!(c.unknown.len(), 1); }
1243
1244 #[test]
1247 fn string_roundtrip() {
1248 const E: Extension<StringCodec> = Extension::new(1, CARRIER);
1249 let mut c = Carrier::default();
1250 c.set_extension(&E, "hello".to_string());
1251 assert_eq!(c.extension(&E), Some("hello".to_string()));
1252 }
1253
1254 #[test]
1255 fn string_invalid_utf8_is_none() {
1256 const E: Extension<StringCodec> = Extension::new(1, CARRIER);
1257 let mut c = Carrier::default();
1258 c.unknown.push(ld(1, vec![0xFF, 0xFE]));
1259 assert_eq!(c.extension(&E), None);
1260 }
1261
1262 #[test]
1263 fn bytes_roundtrip() {
1264 const E: Extension<BytesCodec> = Extension::new(1, CARRIER);
1265 let mut c = Carrier::default();
1266 c.set_extension(&E, vec![0xDE, 0xAD, 0xBE, 0xEF]);
1267 assert_eq!(c.extension(&E), Some(vec![0xDE, 0xAD, 0xBE, 0xEF]));
1268 }
1269
1270 #[test]
1273 fn repeated_scalar_unpacked() {
1274 const E: Extension<Repeated<Int32>> = Extension::new(1, CARRIER);
1275 let mut c = Carrier::default();
1276 c.unknown.push(varint(1, 1));
1277 c.unknown.push(varint(1, 2));
1278 c.unknown.push(varint(1, 3));
1279 assert_eq!(c.extension(&E), vec![1, 2, 3]);
1280 }
1281
1282 #[test]
1283 fn repeated_scalar_packed() {
1284 const E: Extension<Repeated<Int32>> = Extension::new(1, CARRIER);
1286 let mut c = Carrier::default();
1287 c.unknown.push(ld(1, vec![0x01, 0x02, 0xAC, 0x02]));
1288 assert_eq!(c.extension(&E), vec![1, 2, 300]);
1289 }
1290
1291 #[test]
1292 fn repeated_scalar_mixed_packed_unpacked() {
1293 const E: Extension<Repeated<Int32>> = Extension::new(1, CARRIER);
1294 let mut c = Carrier::default();
1295 c.unknown.push(varint(1, 1));
1296 c.unknown.push(ld(1, vec![0x02, 0x03])); c.unknown.push(varint(1, 4));
1298 assert_eq!(c.extension(&E), vec![1, 2, 3, 4]);
1299 }
1300
1301 #[test]
1302 fn repeated_scalar_fixed32_packed() {
1303 const E: Extension<Repeated<Fixed32>> = Extension::new(1, CARRIER);
1305 let mut c = Carrier::default();
1306 c.unknown.push(ld(1, vec![1, 0, 0, 0, 2, 0, 0, 0]));
1307 assert_eq!(c.extension(&E), vec![1_u32, 2_u32]);
1308 }
1309
1310 #[test]
1311 fn repeated_scalar_wrong_wire_type_skipped() {
1312 const E: Extension<Repeated<Int32>> = Extension::new(1, CARRIER);
1313 let mut c = Carrier::default();
1314 c.unknown.push(varint(1, 1));
1315 c.unknown.push(fixed32(1, 0xDEAD)); c.unknown.push(varint(1, 2));
1317 assert_eq!(c.extension(&E), vec![1, 2]);
1318 }
1319
1320 #[test]
1321 fn repeated_scalar_set_roundtrip() {
1322 const E: Extension<Repeated<Sint32>> = Extension::new(1, CARRIER);
1323 let mut c = Carrier::default();
1324 c.set_extension(&E, vec![-1, 0, 1, -100]);
1325 assert_eq!(c.extension(&E), vec![-1, 0, 1, -100]);
1326 assert_eq!(c.unknown.len(), 4);
1328 }
1329
1330 #[test]
1331 fn repeated_string() {
1332 const E: Extension<Repeated<StringCodec>> = Extension::new(1, CARRIER);
1333 let mut c = Carrier::default();
1334 c.set_extension(&E, vec!["a".to_string(), "b".to_string()]);
1335 assert_eq!(c.extension(&E), vec!["a".to_string(), "b".to_string()]);
1336 }
1337
1338 #[test]
1339 fn repeated_string_malformed_element_skipped() {
1340 const E: Extension<Repeated<StringCodec>> = Extension::new(1, CARRIER);
1341 let mut c = Carrier::default();
1342 c.unknown.push(ld(1, b"ok".to_vec()));
1343 c.unknown.push(ld(1, vec![0xFF])); c.unknown.push(ld(1, b"also ok".to_vec()));
1345 assert_eq!(
1348 c.extension(&E),
1349 vec!["ok".to_string(), "also ok".to_string()]
1350 );
1351 }
1352
1353 #[test]
1354 fn repeated_empty_set_not_present() {
1355 const E: Extension<Repeated<Int32>> = Extension::new(1, CARRIER);
1356 let mut c = Carrier::default();
1357 c.set_extension(&E, vec![]);
1358 assert!(!c.has_extension(&E));
1359 assert_eq!(c.extension(&E), Vec::<i32>::new());
1360 }
1361
1362 #[test]
1363 fn packed_repeated_set_twice_one_record() {
1364 const E: Extension<PackedRepeated<Int32>> = Extension::new(1, CARRIER);
1365 let mut c = Carrier::default();
1366 c.set_extension(&E, vec![1, 2]);
1367 c.set_extension(&E, vec![3, 4, 5]);
1368 assert_eq!(c.unknown.len(), 1);
1369 assert_eq!(c.extension(&E), vec![3, 4, 5]);
1370 }
1371
1372 #[test]
1375 fn packed_repeated_encode_one_record() {
1376 const E: Extension<PackedRepeated<Int32>> = Extension::new(1, CARRIER);
1377 let mut c = Carrier::default();
1378 c.set_extension(&E, vec![1, 2, 300]);
1379 assert_eq!(c.unknown.len(), 1);
1381 assert_eq!(
1382 c.unknown.iter().next().unwrap().data,
1383 UnknownFieldData::LengthDelimited(vec![0x01, 0x02, 0xAC, 0x02])
1384 );
1385 assert_eq!(c.extension(&E), vec![1, 2, 300]);
1387 }
1388
1389 #[test]
1390 fn packed_repeated_decode_accepts_unpacked() {
1391 const E: Extension<PackedRepeated<Int32>> = Extension::new(1, CARRIER);
1393 let mut c = Carrier::default();
1394 c.unknown.push(varint(1, 1));
1395 c.unknown.push(varint(1, 2));
1396 assert_eq!(c.extension(&E), vec![1, 2]);
1397 }
1398
1399 #[test]
1400 fn packed_repeated_empty_not_present() {
1401 const E: Extension<PackedRepeated<Int32>> = Extension::new(1, CARRIER);
1402 let mut c = Carrier::default();
1403 c.set_extension(&E, vec![]);
1404 assert!(!c.has_extension(&E));
1405 }
1406
1407 #[test]
1408 fn packed_repeated_fixed64_roundtrip() {
1409 const E: Extension<PackedRepeated<Sfixed64>> = Extension::new(1, CARRIER);
1410 let mut c = Carrier::default();
1411 c.set_extension(&E, vec![-1_i64, 0, i64::MAX]);
1412 assert_eq!(c.unknown.len(), 1);
1413 assert_eq!(c.extension(&E), vec![-1_i64, 0, i64::MAX]);
1414 }
1415
1416 #[derive(Clone, Default, PartialEq, Debug)]
1421 struct TestMsg {
1422 a: i32,
1423 b: i32,
1424 unknown: UnknownFields,
1425 }
1426
1427 impl crate::DefaultInstance for TestMsg {
1428 fn default_instance() -> &'static Self {
1429 static INST: crate::__private::OnceBox<TestMsg> = crate::__private::OnceBox::new();
1430 INST.get_or_init(|| alloc::boxed::Box::new(TestMsg::default()))
1431 }
1432 }
1433
1434 impl crate::Message for TestMsg {
1435 fn compute_size(&self, _cache: &mut crate::SizeCache) -> u32 {
1436 let mut n = 0;
1437 if self.a != 0 {
1438 n += 1 + crate::encoding::varint_len(self.a as i64 as u64);
1439 }
1440 if self.b != 0 {
1441 n += 1 + crate::encoding::varint_len(self.b as i64 as u64);
1442 }
1443 n += self.unknown.encoded_len();
1444 n as u32
1445 }
1446 fn write_to(&self, _cache: &mut crate::SizeCache, buf: &mut impl bytes::BufMut) {
1447 use crate::encoding::encode_varint;
1448 if self.a != 0 {
1449 encode_varint(1 << 3, buf);
1450 encode_varint(self.a as i64 as u64, buf);
1451 }
1452 if self.b != 0 {
1453 encode_varint(2 << 3, buf);
1454 encode_varint(self.b as i64 as u64, buf);
1455 }
1456 self.unknown.write_to(buf);
1457 }
1458 fn merge_field(
1459 &mut self,
1460 tag: crate::encoding::Tag,
1461 buf: &mut impl bytes::Buf,
1462 _depth: u32,
1463 ) -> Result<(), crate::DecodeError> {
1464 match tag.field_number() {
1465 1 => self.a = crate::types::decode_int32(buf)?,
1466 2 => self.b = crate::types::decode_int32(buf)?,
1467 _ => crate::encoding::skip_field(tag, buf)?,
1468 }
1469 Ok(())
1470 }
1471 fn clear(&mut self) {
1472 *self = Self::default();
1473 }
1474 }
1475
1476 #[test]
1477 fn message_single_record() {
1478 const E: Extension<MessageCodec<TestMsg>> = Extension::new(1, CARRIER);
1479 let mut c = Carrier::default();
1480 c.unknown.push(ld(1, vec![0x08, 0x05]));
1482 let got = c.extension(&E).expect("decoded");
1483 assert_eq!(got.a, 5);
1484 assert_eq!(got.b, 0);
1485 }
1486
1487 #[test]
1488 fn message_split_records_merge() {
1489 const E: Extension<MessageCodec<TestMsg>> = Extension::new(1, CARRIER);
1492 let mut c = Carrier::default();
1493 c.unknown.push(ld(1, vec![0x08, 0x05])); c.unknown.push(ld(1, vec![0x10, 0x07])); let got = c.extension(&E).expect("decoded");
1496 assert_eq!(got.a, 5);
1497 assert_eq!(got.b, 7);
1498 }
1499
1500 #[test]
1501 fn message_absent_is_none() {
1502 const E: Extension<MessageCodec<TestMsg>> = Extension::new(1, CARRIER);
1503 let c = Carrier::default();
1504 assert!(c.extension(&E).is_none());
1505 }
1506
1507 #[test]
1508 fn message_malformed_is_none() {
1509 const E: Extension<MessageCodec<TestMsg>> = Extension::new(1, CARRIER);
1510 let mut c = Carrier::default();
1511 c.unknown.push(ld(1, vec![0x08, 0x80]));
1513 assert!(c.extension(&E).is_none());
1514 }
1515
1516 #[test]
1517 fn message_set_get_roundtrip() {
1518 const E: Extension<MessageCodec<TestMsg>> = Extension::new(1, CARRIER);
1519 let mut c = Carrier::default();
1520 c.set_extension(
1521 &E,
1522 TestMsg {
1523 a: 3,
1524 b: -1,
1525 unknown: UnknownFields::new(),
1526 },
1527 );
1528 let got = c.extension(&E).expect("decoded");
1529 assert_eq!(got.a, 3);
1530 assert_eq!(got.b, -1);
1531 }
1532
1533 #[test]
1534 fn message_unknown_fields_survive_roundtrip() {
1535 const E: Extension<MessageCodec<TestMsg>> = Extension::new(1, CARRIER);
1537 let mut c = Carrier::default();
1538 c.unknown.push(ld(1, vec![0x08, 0x05, 0x98, 0x06, 0x2A]));
1541 let got = c.extension(&E).expect("decoded");
1542 assert_eq!(got.a, 5);
1543 let mut inner_unk = UnknownFields::new();
1547 inner_unk.push(varint(99, 42));
1548 let msg = TestMsg {
1549 a: 5,
1550 b: 0,
1551 unknown: inner_unk,
1552 };
1553 let mut c = Carrier::default();
1554 c.set_extension(&E, msg);
1555 use crate::Message;
1557 let mut roundtrip = TestMsg::default();
1558 if let UnknownFieldData::LengthDelimited(bytes) = &c.unknown.iter().next().unwrap().data {
1559 assert!(bytes.len() > 2, "payload includes unknown-field bytes");
1562 assert!(bytes.windows(3).any(|w| w == [0x98, 0x06, 0x2A]));
1564 roundtrip.merge_from_slice(bytes).unwrap();
1566 assert_eq!(roundtrip.a, 5);
1567 } else {
1568 panic!("expected LengthDelimited");
1569 }
1570 }
1571
1572 #[test]
1573 fn repeated_message() {
1574 const E: Extension<Repeated<MessageCodec<TestMsg>>> = Extension::new(1, CARRIER);
1575 let mut c = Carrier::default();
1576 c.unknown.push(ld(1, vec![0x08, 0x01])); c.unknown.push(ld(1, vec![0x08, 0x02])); let got = c.extension(&E);
1579 assert_eq!(got.len(), 2);
1580 assert_eq!(got[0].a, 1);
1581 assert_eq!(got[1].a, 2);
1582 }
1583
1584 #[test]
1585 fn repeated_message_malformed_element_skipped() {
1586 const E: Extension<Repeated<MessageCodec<TestMsg>>> = Extension::new(1, CARRIER);
1587 let mut c = Carrier::default();
1588 c.unknown.push(ld(1, vec![0x08, 0x01])); c.unknown.push(ld(1, vec![0x08, 0x80])); c.unknown.push(ld(1, vec![0x08, 0x03])); let got = c.extension(&E);
1592 assert_eq!(got.len(), 2);
1593 assert_eq!(got[0].a, 1);
1594 assert_eq!(got[1].a, 3);
1595 }
1596
1597 fn inner_a(v: u64) -> UnknownFields {
1606 let mut inner = UnknownFields::new();
1607 inner.push(varint(1, v));
1608 inner
1609 }
1610
1611 #[test]
1612 fn group_single_record() {
1613 const E: Extension<GroupCodec<TestMsg>> = Extension::new(1, CARRIER);
1614 let mut c = Carrier::default();
1615 c.unknown.push(group(1, inner_a(5)));
1616 let got = c.extension(&E).expect("decoded");
1617 assert_eq!(got.a, 5);
1618 assert_eq!(got.b, 0);
1619 }
1620
1621 #[test]
1622 fn group_split_records_merge() {
1623 const E: Extension<GroupCodec<TestMsg>> = Extension::new(1, CARRIER);
1626 let mut c = Carrier::default();
1627 c.unknown.push(group(1, inner_a(5)));
1628 let mut inner_b = UnknownFields::new();
1629 inner_b.push(varint(2, 7));
1630 c.unknown.push(group(1, inner_b));
1631 let got = c.extension(&E).expect("decoded");
1632 assert_eq!(got.a, 5);
1633 assert_eq!(got.b, 7);
1634 }
1635
1636 #[test]
1637 fn group_absent_is_none() {
1638 const E: Extension<GroupCodec<TestMsg>> = Extension::new(1, CARRIER);
1639 let c = Carrier::default();
1640 assert!(c.extension(&E).is_none());
1641 }
1642
1643 #[test]
1644 fn group_wrong_wire_type_is_none() {
1645 const E: Extension<GroupCodec<TestMsg>> = Extension::new(1, CARRIER);
1648 let mut c = Carrier::default();
1649 c.unknown.push(ld(1, vec![0x08, 0x05]));
1650 assert!(c.extension(&E).is_none());
1651 }
1652
1653 #[test]
1654 fn group_set_get_roundtrip() {
1655 const E: Extension<GroupCodec<TestMsg>> = Extension::new(1, CARRIER);
1656 let mut c = Carrier::default();
1657 c.set_extension(
1658 &E,
1659 TestMsg {
1660 a: 3,
1661 b: -1,
1662 unknown: UnknownFields::new(),
1663 },
1664 );
1665 match &c.unknown.iter().next().unwrap().data {
1667 UnknownFieldData::Group(_) => {}
1668 other => panic!("expected Group, got {other:?}"),
1669 }
1670 let got = c.extension(&E).expect("decoded");
1671 assert_eq!(got.a, 3);
1672 assert_eq!(got.b, -1);
1673 }
1674
1675 #[test]
1676 fn group_set_empty_message() {
1677 const E: Extension<GroupCodec<TestMsg>> = Extension::new(1, CARRIER);
1680 let mut c = Carrier::default();
1681 c.set_extension(&E, TestMsg::default());
1682 assert!(c.has_extension(&E));
1683 let got = c.extension(&E).expect("decoded");
1684 assert_eq!(got, TestMsg::default());
1685 }
1686
1687 #[test]
1688 fn repeated_group() {
1689 const E: Extension<Repeated<GroupCodec<TestMsg>>> = Extension::new(1, CARRIER);
1690 let mut c = Carrier::default();
1691 c.unknown.push(group(1, inner_a(1)));
1692 c.unknown.push(group(1, inner_a(2)));
1693 let got = c.extension(&E);
1694 assert_eq!(got.len(), 2);
1695 assert_eq!(got[0].a, 1);
1696 assert_eq!(got[1].a, 2);
1697 }
1698
1699 #[test]
1700 fn repeated_group_set_get_roundtrip() {
1701 const E: Extension<Repeated<GroupCodec<TestMsg>>> = Extension::new(1, CARRIER);
1702 let mut c = Carrier::default();
1703 let msgs = vec![
1704 TestMsg {
1705 a: 10,
1706 b: 0,
1707 unknown: UnknownFields::new(),
1708 },
1709 TestMsg {
1710 a: 0,
1711 b: 20,
1712 unknown: UnknownFields::new(),
1713 },
1714 ];
1715 c.set_extension(&E, msgs.clone());
1716 assert_eq!(c.unknown.len(), 2);
1718 for f in c.unknown.iter() {
1719 assert!(matches!(f.data, UnknownFieldData::Group(_)));
1720 }
1721 assert_eq!(c.extension(&E), msgs);
1722 }
1723
1724 #[test]
1727 fn scalar_roundtrip_table() {
1728 macro_rules! rt {
1729 ($codec:ty, $v:expr) => {{
1730 const E: Extension<$codec> = Extension::new(1, CARRIER);
1731 let mut c = Carrier::default();
1732 c.set_extension(&E, $v);
1733 assert_eq!(c.extension(&E), Some($v), stringify!($codec));
1734 }};
1735 }
1736 rt!(Int64, -1_i64);
1737 rt!(Uint64, u64::MAX);
1738 rt!(Sint64, i64::MIN);
1739 rt!(Fixed32, u32::MAX);
1740 rt!(Fixed64, u64::MAX);
1741 rt!(Sfixed64, -1_i64);
1742 rt!(EnumI32, 42);
1743 }
1744
1745 #[test]
1746 fn fixed64_packed_decode_partial_tail_ignored() {
1747 const E: Extension<Repeated<Fixed64>> = Extension::new(1, CARRIER);
1749 let mut c = Carrier::default();
1750 let mut payload = 42_u64.to_le_bytes().to_vec();
1751 payload.extend_from_slice(&[0x01, 0x02, 0x03]);
1752 c.unknown.push(ld(1, payload));
1753 assert_eq!(c.extension(&E), vec![42_u64]);
1754 }
1755
1756 #[test]
1757 fn varint_packed_decode_malformed_tail_stops() {
1758 const E: Extension<Repeated<Int32>> = Extension::new(1, CARRIER);
1760 let mut c = Carrier::default();
1761 c.unknown.push(ld(1, vec![0x01, 0x80]));
1762 assert_eq!(c.extension(&E), vec![1]);
1763 }
1764
1765 #[test]
1767 fn fixed64_wrong_wire_type() {
1768 const E: Extension<Fixed64> = Extension::new(1, CARRIER);
1769 let mut c = Carrier::default();
1770 c.unknown.push(fixed64(1, 0xDEADBEEF));
1771 assert_eq!(c.extension(&E), Some(0xDEADBEEF_u64));
1772 let mut c = Carrier::default();
1773 c.unknown.push(fixed32(1, 0)); assert_eq!(c.extension(&E), None);
1775 }
1776}