1#![no_std]
2#![forbid(unsafe_code)]
3#![deny(missing_docs)]
4pub mod bit_cast;
58
59extern crate alloc;
60
61use alloc::{
62 string::{String, ToString},
63 vec::Vec,
64};
65pub use bit_cast::*;
66use core::mem::size_of;
67
68const MAX_VARINT_LENGTH: usize = u64::BITS as usize * 8 / 7 + 1;
69const BIT_SHIFT: [u64; 10] = [0, 7, 14, 21, 28, 35, 42, 49, 56, 63];
70
71#[derive(Debug, PartialEq)]
74pub enum Type {
75 Varint = 0,
77 Fixed64 = 1,
80 Bytes = 2,
83 Fixed32 = 5,
86 None = 7,
88}
89impl From<u8> for Type {
90 fn from(val: u8) -> Self {
94 match val & 0x7 {
95 0 => Type::Varint,
96 1 => Type::Fixed64,
97 2 => Type::Bytes,
98 5 => Type::Fixed32,
99 7 => Type::None,
100 _ => panic!("Invalid value for Type"),
101 }
102 }
103}
104impl From<Type> for u64 {
105 fn from(t: Type) -> Self {
106 match t {
107 Type::Varint => 0,
108 Type::Fixed64 => 1,
109 Type::Bytes => 2,
110 Type::Fixed32 => 5,
111 Type::None => 7,
112 }
113 }
114}
115
116#[derive(Debug, PartialEq)]
120pub struct Field {
121 pub tag: u64,
123 pub r#type: Type,
125}
126
127pub trait ProtoRead {
172 fn read(&mut self, tag: u64, pbf: &mut Protobuf);
218}
219
220pub trait ProtoWrite {
262 fn write(&self, pbf: &mut Protobuf);
304}
305
306#[derive(Clone, Debug, Default)]
325pub struct Protobuf {
326 buf: Vec<u8>,
327 pos: usize,
328}
329impl From<Vec<u8>> for Protobuf {
330 fn from(buf: Vec<u8>) -> Protobuf {
331 Protobuf::from_input(buf)
332 }
333}
334impl Protobuf {
335 pub fn new() -> Protobuf {
337 let buf = Vec::new();
338 Protobuf { buf, pos: 0 }
339 }
340
341 pub fn from_input(buf: Vec<u8>) -> Protobuf {
343 Protobuf { buf, pos: 0 }
344 }
345
346 pub fn set_pos(&mut self, pos: usize) {
348 self.pos = pos;
349 }
350
351 pub fn get_pos(&self) -> usize {
353 self.pos
354 }
355
356 pub fn len(&self) -> usize {
358 self.buf.len()
359 }
360
361 pub fn is_empty(&self) -> bool {
363 self.buf.is_empty()
364 }
365
366 pub fn decode_varint(&mut self) -> u64 {
370 if self.pos >= self.len() {
371 panic!("EOF");
372 }
373
374 let mut val: u64 = 0;
375
376 for (n, shift) in BIT_SHIFT.iter().enumerate().take(MAX_VARINT_LENGTH) {
377 let b = self.buf[self.pos] as u64;
378 self.pos += 1;
379 if n == 0 {
380 if b & 0x80 == 0 {
381 return b;
382 }
383 val = b & 0x7f;
384 } else {
385 val |= (b & 0x7f) << shift;
386 }
387 if b < 0x80 {
388 break;
389 }
390 }
391
392 val
393 }
394
395 pub fn skip(&mut self, t: Type) {
398 match t {
399 Type::Varint => _ = self.decode_varint(),
400 Type::Fixed64 => self.pos += 8,
401 Type::Fixed32 => self.pos += 4,
402 Type::Bytes => self.pos += self.decode_varint() as usize,
403 Type::None => { }
404 };
405 }
406
407 pub fn read_field(&mut self) -> Field {
409 let val = self.decode_varint();
410 Field { tag: val >> 3, r#type: Type::from((val & 0x7) as u8) }
411 }
412
413 pub fn read_bytes(&mut self) -> Vec<u8> {
415 let end = self.decode_varint() as usize + self.pos;
416 let bytes = self.buf[self.pos..end].to_vec();
417 self.pos += end - self.pos;
418
419 bytes
420 }
421
422 pub fn read_string(&mut self) -> String {
424 String::from_utf8_lossy(&self.read_bytes()).to_string()
425 }
426
427 pub fn read_fixed<T>(&mut self) -> T
429 where
430 T: BitCast,
431 {
432 let mut val: u64 = 0;
433 let size = size_of::<T>();
434
435 let mut n = 0;
436 while n < size {
437 val |= (self.buf[self.pos] as u64) << (n << 3);
438 self.pos += 1;
439 n += 1;
440 }
441
442 if cfg!(target_endian = "big") {
443 val = val.swap_bytes();
444 }
445
446 T::from_u64(val)
447 }
448
449 pub fn read_varint<T>(&mut self) -> T
451 where
452 T: BitCast,
453 {
454 let val = self.decode_varint();
455 T::from_u64(val)
456 }
457
458 pub fn read_s_varint<T>(&mut self) -> T
463 where
464 T: TryFrom<i64>,
465 {
466 T::try_from(zagzig(self.decode_varint()))
467 .unwrap_or_else(|_| panic!("read_s_varint: Invalid conversion"))
468 }
469
470 pub fn read_packed<T>(&mut self) -> Vec<T>
472 where
473 T: BitCast,
474 {
475 let end = self.decode_varint() as usize + self.pos;
476 let mut res: Vec<T> = Vec::new();
477 while self.pos < end {
478 res.push(self.read_varint::<T>());
479 }
480
481 res
482 }
483
484 pub fn read_s_packed<T>(&mut self) -> Vec<T>
486 where
487 T: TryFrom<i64>,
488 {
489 let end = self.decode_varint() as usize + self.pos;
490 let mut res: Vec<T> = Vec::new();
491 while self.pos < end {
492 res.push(self.read_s_varint::<T>());
493 }
494
495 res
496 }
497
498 pub fn read_fields<T: ProtoRead>(&mut self, t: &mut T, end: Option<usize>) {
502 let end = end.unwrap_or(self.len());
503
504 while self.pos < end {
505 let field = self.read_field();
506 let start_pos = self.pos;
507 t.read(field.tag, self);
508 if start_pos == self.pos {
509 self.skip(field.r#type);
510 }
511 }
512 }
513
514 pub fn read_message<T: ProtoRead>(&mut self, t: &mut T) {
517 let end = self.decode_varint() as usize + self.pos;
518
519 self.read_fields(t, Some(end));
520 }
521
522 pub fn write_varint<T: BitCast>(&mut self, val: T) {
526 let mut val = val.to_u64();
527
528 while val >= 0x80 {
529 self.buf.push((val & 0x7f) as u8 | 0x80);
530 val >>= 7;
531 }
532 self.buf.push(val as u8);
533 }
534
535 pub fn write_s_varint(&mut self, val: i64) {
537 self.write_varint(zigzag(val));
538 }
539
540 pub fn write_fixed<T>(&mut self, val: T)
542 where
543 T: BitCast,
544 {
545 let size = size_of::<T>();
546 let mut val: u64 = val.to_u64();
547
548 if cfg!(target_endian = "big") {
549 val = val.swap_bytes();
550 }
551
552 let mut n = 0;
553 while n < size {
554 self.buf.push((val >> (n << 3)) as u8);
555 n += 1;
556 }
557 }
558
559 pub fn write_field(&mut self, tag: u64, r#type: Type) {
561 let b: u64 = (tag << 3) | Into::<u64>::into(r#type);
562 self.write_varint(b);
563 }
564
565 pub fn write_length_varint(&mut self, tag: u64, val: usize) {
567 self.write_field(tag, Type::Bytes);
568 self.write_varint(val);
569 }
570
571 pub fn write_varint_field<T>(&mut self, tag: u64, val: T)
573 where
574 T: BitCast,
575 {
576 self.write_field(tag, Type::Varint);
577 self.write_varint(val);
578 }
579
580 pub fn write_s_varint_field<T>(&mut self, tag: u64, val: T)
582 where
583 T: Into<i64>,
584 {
585 self.write_field(tag, Type::Varint);
586 self.write_s_varint(val.into());
587 }
588
589 pub fn write_packed_varint<T>(&mut self, tag: u64, val: &[T])
591 where
592 T: BitCast + Copy,
593 {
594 let mut pbf = Protobuf::new();
595
596 for &v in val {
597 pbf.write_varint::<T>(v);
598 }
599
600 self.write_bytes_field(tag, &(pbf.take()));
601 }
602
603 pub fn write_packed_s_varint<T>(&mut self, tag: u64, val: &[T])
605 where
606 T: Into<i64> + Copy,
607 {
608 let mut pbf = Protobuf::new();
609
610 for &v in val {
611 pbf.write_s_varint(v.into());
612 }
613
614 self.write_bytes_field(tag, &(pbf.take()));
615 }
616
617 pub fn write_fixed_field<T>(&mut self, tag: u64, val: T)
623 where
624 T: BitCast + Copy,
625 {
626 let type_ = match size_of::<T>() {
627 4 => Type::Fixed32,
628 8 => Type::Fixed64,
629 _ => panic!("Invalid fixed type"),
630 };
631
632 self.write_field(tag, type_);
633 self.write_fixed(val);
634 }
635
636 pub fn write_string(&mut self, val: &str) {
638 self.write_varint(val.len());
639 self.buf.extend_from_slice(val.as_bytes());
640 }
641
642 pub fn write_string_field(&mut self, tag: u64, val: &str) {
644 self.write_length_varint(tag, val.len());
645 self.buf.extend_from_slice(val.as_bytes());
646 }
647
648 pub fn write_bytes_field(&mut self, tag: u64, val: &[u8]) {
650 self.write_length_varint(tag, val.len());
651 self.buf.extend_from_slice(val)
652 }
653
654 pub fn write_message<T: ProtoWrite>(&mut self, tag: u64, t: &T) {
658 let mut pbf = Protobuf::new();
659 t.write(&mut pbf);
660 let bytes = pbf.take();
661 self.write_bytes_field(tag, &bytes);
662 }
663
664 pub fn write_fields<T: ProtoWrite>(&mut self, t: &T) {
668 t.write(self);
669 }
670
671 pub fn take(&mut self) -> Vec<u8> {
673 core::mem::take(&mut self.buf)
674 }
675}
676
677pub fn zigzag(val: i64) -> u64 {
679 ((val << 1) ^ (val >> 63)) as u64
680}
681
682pub fn zagzig(val: u64) -> i64 {
684 (val >> 1) as i64 ^ -((val & 1) as i64)
685}
686
687#[cfg(test)]
688mod tests {
689 use super::*;
690 use alloc::vec;
691
692 #[test]
693 fn it_works() {
694 let buf = vec![];
695 let pb = Protobuf::from_input(buf);
696 assert_eq!(pb.pos, 0);
697 }
698
699 #[test]
700 fn test_zigzag() {
701 assert_eq!(zigzag(0), 0);
702 assert_eq!(zagzig(0), 0);
703 assert_eq!(zagzig(zigzag(0)), 0);
704 assert_eq!(zagzig(zigzag(5)), 5);
705 assert_eq!(zagzig(zigzag(-5)), -5);
706
707 let max_i64 = i64::MAX;
708 let min_i64 = i64::MIN;
709 assert_eq!(zagzig(zigzag(max_i64)), max_i64);
710 assert_eq!(zagzig(zigzag(min_i64)), min_i64);
711 }
712
713 #[test]
714 #[should_panic(expected = "Invalid value for Type")]
715 fn test_write_field_panic() {
716 let _t: Type = Type::from(22);
717 }
718
719 #[test]
720 #[should_panic(expected = "EOF")]
721 fn test_read_past_end_panic() {
722 let mut pb = Protobuf::new();
723 pb.write_varint(1);
724 pb.write_varint(300);
725
726 let bytes = pb.take();
727 let mut pb = Protobuf::from_input(bytes);
728 pb.read_varint::<u64>();
729 pb.read_varint::<u64>();
730 pb.read_varint::<u64>();
731 }
732
733 #[test]
734 fn test_varint() {
735 let mut pb = Protobuf::new();
736 pb.write_varint(1);
737 pb.write_varint(300);
738 pb.write_varint(0x7fffffffffffffff_u64);
739
740 let bytes = pb.take();
741 assert_eq!(bytes, &[1, 172, 2, 255, 255, 255, 255, 255, 255, 255, 255, 127]);
742
743 let mut pb = Protobuf::from_input(bytes);
744 assert_eq!(pb.read_varint::<u64>(), 1);
745 assert_eq!(pb.read_varint::<u64>(), 300);
746 assert_eq!(pb.read_varint::<u64>(), 0x7fffffffffffffff);
747 }
748
749 #[test]
750 fn test_varint_field() {
751 let mut pb = Protobuf::new();
752 pb.write_varint_field(0, 5_u8);
754 pb.write_varint_field(1, 1_u16);
755 pb.write_varint_field(2, 300_u32);
756 pb.write_varint_field(3, 0x7fffffffffffffff_u64);
757 pb.write_varint_field(4, -5_i8);
759 pb.write_varint_field(5, -1_i16);
760 pb.write_varint_field(6, -300_i32);
761 pb.write_varint_field(7, -94949494949_i64);
762 pb.write_varint_field(8, true);
764 pb.write_varint_field(9, false);
765 #[derive(Debug, PartialEq)]
767 enum TestEnum {
768 A = 1,
769 B = 2,
770 C = 3,
771 }
772 impl BitCast for TestEnum {
773 fn from_u64(val: u64) -> Self {
774 match val {
775 1 => TestEnum::A,
776 2 => TestEnum::B,
777 3 => TestEnum::C,
778 _ => panic!("Invalid enum value"),
779 }
780 }
781 fn to_u64(&self) -> u64 {
782 match self {
783 TestEnum::A => 1,
784 TestEnum::B => 2,
785 TestEnum::C => 3,
786 }
787 }
788 }
789 pb.write_varint_field(10, TestEnum::B);
790 pb.write_varint_field(11, TestEnum::A);
791 pb.write_varint_field(12, TestEnum::C);
792 pb.write_varint_field(13, core::f32::consts::PI);
794 pb.write_varint_field(14, -core::f64::consts::PI);
795
796 let bytes = pb.take();
797 let mut pb = Protobuf::from_input(bytes);
798
799 assert_eq!(pb.read_field(), Field { tag: 0, r#type: Type::Varint });
802 assert_eq!(pb.read_varint::<u8>(), 5);
803 assert_eq!(pb.read_field(), Field { tag: 1, r#type: Type::Varint });
805 assert_eq!(pb.read_varint::<u16>(), 1);
806 assert_eq!(pb.read_field(), Field { tag: 2, r#type: Type::Varint });
808 assert_eq!(pb.read_varint::<u32>(), 300);
809 assert_eq!(pb.read_field(), Field { tag: 3, r#type: Type::Varint });
811 assert_eq!(pb.read_varint::<u64>(), 0x7fffffffffffffff);
812
813 assert_eq!(pb.read_field(), Field { tag: 4, r#type: Type::Varint });
816 assert_eq!(pb.read_varint::<i8>(), -5);
817 assert_eq!(pb.read_field(), Field { tag: 5, r#type: Type::Varint });
819 assert_eq!(pb.read_varint::<i16>(), -1);
820 assert_eq!(pb.read_field(), Field { tag: 6, r#type: Type::Varint });
822 assert_eq!(pb.read_varint::<i32>(), -300);
823 assert_eq!(pb.read_field(), Field { tag: 7, r#type: Type::Varint });
825 assert_eq!(pb.read_varint::<i64>(), -94949494949);
826
827 assert_eq!(pb.read_field(), Field { tag: 8, r#type: Type::Varint });
830 assert!(pb.read_varint::<bool>());
831 assert_eq!(pb.read_field(), Field { tag: 9, r#type: Type::Varint });
833 assert!(!pb.read_varint::<bool>());
834
835 assert_eq!(pb.read_field(), Field { tag: 10, r#type: Type::Varint });
838 assert_eq!(pb.read_varint::<TestEnum>(), TestEnum::B);
839 assert_eq!(pb.read_field(), Field { tag: 11, r#type: Type::Varint });
841 assert_eq!(pb.read_varint::<TestEnum>(), TestEnum::A);
842 assert_eq!(pb.read_field(), Field { tag: 12, r#type: Type::Varint });
844 assert_eq!(pb.read_varint::<TestEnum>(), TestEnum::C);
845
846 assert_eq!(pb.read_field(), Field { tag: 13, r#type: Type::Varint });
849 assert_eq!(pb.read_varint::<f32>(), core::f32::consts::PI);
850 assert_eq!(pb.read_field(), Field { tag: 14, r#type: Type::Varint });
852 assert_eq!(pb.read_varint::<f64>(), -core::f64::consts::PI);
853 }
854
855 #[test]
856 fn test_varint_field_2() {
857 let mut pb = Protobuf::new();
858 pb.write_varint_field(1, 5_u8);
859 pb.write_varint_field(2, 5_u16);
860 pb.write_varint_field(3, 5_u32);
861 pb.write_varint_field(4, 5_u64);
862 pb.write_varint_field(5, 5_usize);
863 pb.write_varint_field(6, -5_isize);
864
865 let bytes = pb.take();
866 let mut pb: Protobuf = bytes.into();
867
868 assert_eq!(pb.read_field(), Field { tag: 1, r#type: Type::Varint });
869 assert_eq!(pb.read_varint::<u8>(), 5);
870 assert_eq!(pb.read_field(), Field { tag: 2, r#type: Type::Varint });
871 assert_eq!(pb.read_varint::<u16>(), 5);
872 assert_eq!(pb.read_field(), Field { tag: 3, r#type: Type::Varint });
873 assert_eq!(pb.read_varint::<u32>(), 5);
874 assert_eq!(pb.read_field(), Field { tag: 4, r#type: Type::Varint });
875 assert_eq!(pb.read_varint::<u64>(), 5);
876 assert_eq!(pb.read_field(), Field { tag: 5, r#type: Type::Varint });
877 assert_eq!(pb.read_varint::<usize>(), 5);
878 assert_eq!(pb.read_field(), Field { tag: 6, r#type: Type::Varint });
879 assert_eq!(pb.read_varint::<isize>(), -5);
880 }
881
882 #[test]
883 fn test_s_varint_field() {
884 let mut pb = Protobuf::new();
885 pb.write_s_varint_field(1, 5_i8);
886 pb.write_s_varint_field(2, 5_i16);
887 pb.write_s_varint_field(3, 5_i32);
888 pb.write_s_varint_field(4, 5_i64);
889 pb.write_s_varint_field(5, -5_i8);
890 pb.write_s_varint_field(6, -5_i16);
891 pb.write_s_varint_field(7, -5_i32);
892 pb.write_s_varint_field(8, -5_i64);
893
894 let bytes = pb.take();
895 let mut pb = Protobuf::from_input(bytes);
896
897 assert_eq!(pb.read_field(), Field { tag: 1, r#type: Type::Varint });
898 assert_eq!(pb.read_s_varint::<i8>(), 5);
899 assert_eq!(pb.read_field(), Field { tag: 2, r#type: Type::Varint });
900 assert_eq!(pb.read_s_varint::<i16>(), 5);
901 assert_eq!(pb.read_field(), Field { tag: 3, r#type: Type::Varint });
902 assert_eq!(pb.read_s_varint::<i32>(), 5);
903 assert_eq!(pb.read_field(), Field { tag: 4, r#type: Type::Varint });
904 assert_eq!(pb.read_s_varint::<i64>(), 5);
905 assert_eq!(pb.read_field(), Field { tag: 5, r#type: Type::Varint });
906 assert_eq!(pb.read_s_varint::<i8>(), -5);
907 assert_eq!(pb.read_field(), Field { tag: 6, r#type: Type::Varint });
908 assert_eq!(pb.read_s_varint::<i16>(), -5);
909 assert_eq!(pb.read_field(), Field { tag: 7, r#type: Type::Varint });
910 assert_eq!(pb.read_s_varint::<i32>(), -5);
911 assert_eq!(pb.read_field(), Field { tag: 8, r#type: Type::Varint });
912 assert_eq!(pb.read_s_varint::<i64>(), -5);
913 }
914
915 #[test]
916 fn test_fixed() {
917 let mut pb = Protobuf::new();
918 pb.write_fixed_field(1, 5_u32);
919 pb.write_fixed_field(2, -5_i32);
920 pb.write_fixed_field(3, 5.5_f32);
921 pb.write_fixed_field(4, 5_u64);
922 pb.write_fixed_field(5, -5_i64);
923 pb.write_fixed_field(6, 5.5_f64);
924
925 let bytes = pb.take();
926 let mut pb = Protobuf::from_input(bytes);
927
928 assert_eq!(pb.read_field(), Field { tag: 1, r#type: Type::Fixed32 });
929 assert_eq!(pb.read_fixed::<u32>(), 5);
930 assert_eq!(pb.read_field(), Field { tag: 2, r#type: Type::Fixed32 });
931 assert_eq!(pb.read_fixed::<i32>(), -5);
932 assert_eq!(pb.read_field(), Field { tag: 3, r#type: Type::Fixed32 });
933 assert_eq!(pb.read_fixed::<f32>(), 5.5);
934 assert_eq!(pb.read_field(), Field { tag: 4, r#type: Type::Fixed64 });
935 assert_eq!(pb.read_fixed::<u64>(), 5);
936 assert_eq!(pb.read_field(), Field { tag: 5, r#type: Type::Fixed64 });
937 assert_eq!(pb.read_fixed::<i64>(), -5);
938 assert_eq!(pb.read_field(), Field { tag: 6, r#type: Type::Fixed64 });
939 assert_eq!(pb.read_fixed::<f64>(), 5.5);
940 }
941
942 #[test]
943 #[should_panic(expected = "Invalid fixed type")]
944 fn test_fixed_panic() {
945 let mut pb = Protobuf::new();
946 pb.write_fixed_field(1, 1_u8);
947 }
948
949 #[test]
950 fn test_string() {
951 let mut pb = Protobuf::new();
952 pb.write_string_field(1, "hello");
953 pb.write_string_field(2, "world");
954
955 let bytes = pb.take();
956 let mut pb = Protobuf::from_input(bytes);
957
958 assert_eq!(pb.read_field(), Field { tag: 1, r#type: Type::Bytes });
959 assert_eq!(pb.read_string(), "hello");
960 assert_eq!(pb.read_field(), Field { tag: 2, r#type: Type::Bytes });
961 assert_eq!(pb.read_string(), "world");
962 }
963
964 #[test]
965 fn test_bytes() {
966 let mut pb = Protobuf::new();
967 pb.write_bytes_field(1, &[1, 2, 3]);
968 pb.write_bytes_field(2, &[4, 5, 6]);
969
970 let bytes = pb.take();
971 let mut pb = Protobuf::from_input(bytes);
972
973 assert_eq!(pb.read_field(), Field { tag: 1, r#type: Type::Bytes });
974 assert_eq!(pb.read_bytes(), &[1, 2, 3]);
975 assert_eq!(pb.read_field(), Field { tag: 2, r#type: Type::Bytes });
976 assert_eq!(pb.read_bytes(), &[4, 5, 6]);
977 }
978
979 #[test]
980 fn test_write_field() {
981 let mut pb = Protobuf::new();
982 pb.write_field(1, Type::Varint);
983 pb.write_field(2, Type::None);
984
985 let bytes = pb.take();
986 let mut pb = Protobuf::from_input(bytes);
987
988 assert_eq!(pb.read_field(), Field { tag: 1, r#type: Type::Varint });
989 assert_eq!(pb.read_field(), Field { tag: 2, r#type: Type::None });
990 }
991
992 #[test]
993 fn test_set_pos() {
994 let mut pb = Protobuf::new();
995 pb.write_varint_field(1, 5);
996 pb.write_varint_field(2, 5);
997 pb.write_varint_field(3, 5);
998
999 let bytes = pb.take();
1000 let mut pb = Protobuf::from_input(bytes);
1001
1002 pb.set_pos(2);
1003 assert_eq!(pb.read_field(), Field { tag: 2, r#type: Type::Varint });
1004 assert_eq!(pb.read_varint::<u8>(), 5);
1005 assert_eq!(pb.read_field(), Field { tag: 3, r#type: Type::Varint });
1006 assert_eq!(pb.read_varint::<u8>(), 5);
1007 }
1008
1009 #[test]
1010 fn test_skip() {
1011 let mut pb = Protobuf::new();
1012 pb.write_varint_field(1, 5_u8);
1013 pb.write_fixed_field(2, -5_i32);
1014 pb.write_fixed_field(3, 5.5_f64);
1015 pb.write_packed_varint::<u16>(4, &[1, 2, 3, 4, 5]);
1016 pb.write_field(5, Type::None);
1017 pb.write_varint_field(6, false);
1018
1019 let bytes = pb.take();
1020 let mut pb = Protobuf::from_input(bytes);
1021
1022 let mut field = pb.read_field();
1023 pb.skip(field.r#type); field = pb.read_field();
1025 pb.skip(field.r#type); field = pb.read_field();
1027 pb.skip(field.r#type); field = pb.read_field();
1029 pb.skip(field.r#type); field = pb.read_field();
1031 pb.skip(field.r#type); assert_eq!(pb.read_field(), Field { tag: 6, r#type: Type::Varint });
1033 }
1034
1035 #[test]
1036 fn test_packed_and_s_packed() {
1037 let mut pb = Protobuf::new();
1038 pb.write_packed_varint::<u16>(1, &[1, 2, 3]);
1039 pb.write_packed_varint::<f32>(2, &[4.4, 5.5, 6.6]);
1040 pb.write_packed_s_varint(3, &[-1, -2, -3]);
1041
1042 let bytes = pb.take();
1043 let mut pb = Protobuf::from_input(bytes);
1044
1045 assert_eq!(pb.read_field(), Field { tag: 1, r#type: Type::Bytes });
1046 assert_eq!(pb.read_packed::<u16>(), vec![1, 2, 3]);
1047 assert_eq!(pb.read_field(), Field { tag: 2, r#type: Type::Bytes });
1048 assert_eq!(pb.read_packed::<f32>(), vec![4.4, 5.5, 6.6]);
1049 assert_eq!(pb.read_field(), Field { tag: 3, r#type: Type::Bytes });
1050 assert_eq!(pb.read_s_packed::<i32>(), vec![-1, -2, -3]);
1051 }
1052
1053 #[test]
1054 fn test_message() {
1055 #[derive(Debug, PartialEq, Default)]
1056 struct TestMessage {
1057 a: i32,
1058 b: String,
1059 }
1060 impl TestMessage {
1061 fn new(a: i32, b: &str) -> Self {
1062 TestMessage { a, b: b.into() }
1063 }
1064 }
1065 impl ProtoWrite for TestMessage {
1066 fn write(&self, pb: &mut Protobuf) {
1067 pb.write_varint_field::<u64>(1, self.a as u64);
1068 pb.write_string_field(2, &self.b);
1069 }
1070 }
1071 impl ProtoRead for TestMessage {
1072 fn read(&mut self, tag: u64, pb: &mut Protobuf) {
1073 match tag {
1074 1 => self.a = pb.read_varint(),
1075 2 => self.b = pb.read_string(),
1076 _ => panic!("Invalid tag"),
1077 }
1078 }
1079 }
1080
1081 let mut pb = Protobuf::new();
1082 let msg = TestMessage::new(1, "hello");
1083 pb.write_message(1, &msg);
1084
1085 let bytes = pb.take();
1086 let mut pb = Protobuf::from_input(bytes);
1087
1088 let field = pb.read_field();
1090 assert_eq!(field, Field { tag: 1, r#type: Type::Bytes });
1091
1092 let mut msg = TestMessage::default();
1093 pb.read_message(&mut msg);
1094 assert_eq!(msg.a, 1);
1095 assert_eq!(msg.b, "hello");
1096 }
1097
1098 #[test]
1099 fn test_message_with_skip() {
1100 #[derive(Debug, PartialEq, Default)]
1101 struct TestMessage {
1102 a: i32,
1103 b: String,
1104 }
1105 impl TestMessage {
1106 fn new(a: i32, b: &str) -> Self {
1107 TestMessage { a, b: b.into() }
1108 }
1109 }
1110 impl ProtoWrite for TestMessage {
1111 fn write(&self, pb: &mut Protobuf) {
1112 pb.write_varint_field::<u64>(1, self.a as u64);
1113 pb.write_string_field(2, &self.b);
1114 }
1115 }
1116 impl ProtoRead for TestMessage {
1117 fn read(&mut self, tag: u64, pb: &mut Protobuf) {
1118 if tag == 2 {
1119 self.b = pb.read_string()
1120 }
1121 }
1122 }
1123
1124 let mut pb = Protobuf::new();
1125 let msg = TestMessage::new(1, "hello");
1126 pb.write_message(1, &msg);
1127
1128 let bytes = pb.take();
1129 let mut pb = Protobuf::from_input(bytes);
1130
1131 let field = pb.read_field();
1133 assert_eq!(field, Field { tag: 1, r#type: Type::Bytes });
1134
1135 let mut msg = TestMessage::default();
1136 pb.read_message(&mut msg);
1137 assert_eq!(msg.a, 0);
1138 assert_eq!(msg.b, "hello");
1139
1140 let mut pb = Protobuf::new();
1142 let msg = TestMessage::new(2, "world");
1143 pb.write_fields(&msg);
1144
1145 let bytes = pb.take();
1146 assert_eq!(bytes, vec![8, 2, 18, 5, 119, 111, 114, 108, 100]);
1147 let mut pb = Protobuf::from_input(bytes);
1148 let mut msg = TestMessage::default();
1149 pb.read_fields(&mut msg, None);
1150 assert_eq!(msg.a, 0);
1151 assert_eq!(msg.b, "world");
1152 }
1153
1154 #[test]
1155 fn unicode_string() {
1156 let mut pb = Protobuf::new();
1157 pb.write_string("你好");
1158
1159 let bytes = pb.take();
1160 let mut pb = Protobuf::from_input(bytes);
1161
1162 assert_eq!(pb.read_string(), "你好");
1163 }
1164
1165 #[test]
1166 fn write_float() {
1167 let mut pb = Protobuf::new();
1168 pb.write_varint(5.5_f32);
1169
1170 let bytes = pb.take();
1171 assert_eq!(bytes, vec![128, 128, 192, 133, 4]);
1172
1173 let mut pb2 = Protobuf::new();
1174 pb2.write_varint(30994030.23423423_f64);
1175
1176 let bytes2 = pb2.take();
1177 assert_eq!(bytes2, vec![228, 216, 253, 157, 238, 220, 227, 190, 65]);
1178 }
1179
1180 #[test]
1181 fn is_empty() {
1182 let mut pb = Protobuf::new();
1183 assert!(pb.is_empty());
1184 pb.write_varint(5.5_f32);
1185 assert!(!pb.is_empty());
1186 }
1187
1188 #[test]
1189 fn get_pos() {
1190 let mut pb = Protobuf::new();
1191 pb.write_varint(5.5_f32);
1192
1193 let bytes = pb.take();
1194 assert_eq!(bytes, vec![128, 128, 192, 133, 4]);
1195
1196 let mut pb: Protobuf = bytes.into();
1197 let data = pb.read_varint::<f32>();
1198 assert_eq!(data, 5.5_f32);
1199
1200 assert_eq!(pb.get_pos(), 5);
1201 }
1202
1203 #[test]
1204 fn bug_test() {
1205 let mut pb = Protobuf::new();
1206 pb.write_bytes_field(1, &[127, 55, 192, 128, 0, 0, 128, 182, 11, 129, 108, 22]);
1207
1208 let bytes = pb.take();
1209 let mut pb = Protobuf::from_input(bytes);
1210
1211 let _field = pb.read_field();
1212 assert_eq!(pb.read_bytes(), &[127, 55, 192, 128, 0, 0, 128, 182, 11, 129, 108, 22]);
1213 }
1214
1215 #[test]
1216 fn bug_test_packed() {
1217 let mut pb = Protobuf::new();
1218 let bytes: Vec<u8> = vec![127, 55, 192, 128, 0, 0, 128, 182, 11, 129, 108, 22];
1219 pb.write_packed_varint::<u8>(1, &bytes);
1220
1221 let bytes = pb.take();
1222 let mut pb = Protobuf::from_input(bytes);
1223
1224 let _field = pb.read_field();
1225 assert_eq!(pb.read_packed::<u8>(), &[127, 55, 192, 128, 0, 0, 128, 182, 11, 129, 108, 22]);
1226 }
1227
1228 #[test]
1229 fn test_bug_128() {
1230 let mut pb = Protobuf::new();
1231 pb.write_varint::<u8>(127);
1232 pb.write_varint(55);
1233 pb.write_varint(192);
1234 let bytes = pb.take();
1235 let mut pb = Protobuf::from_input(bytes);
1236 assert_eq!(pb.read_varint::<u8>(), 127);
1237 assert_eq!(pb.read_varint::<u8>(), 55);
1238 }
1239}