1use byteorder::BigEndian;
498use byteorder::{self, ReadBytesExt};
499pub use msgpack_schema_impl::*;
500use msgpack_value::Value;
501use msgpack_value::{Bin, Ext, Int, Str};
502use std::convert::TryFrom;
503use std::convert::TryInto;
504use std::io::Write;
505use thiserror::Error;
506
507pub struct Serializer {
509 w: Vec<u8>,
510}
511
512impl Serializer {
513 fn new() -> Self {
514 Self { w: vec![] }
515 }
516 fn with_vec(w: Vec<u8>) -> Self {
517 Self { w }
518 }
519 fn into_inner(self) -> Vec<u8> {
520 self.w
521 }
522
523 pub fn serialize_nil(&mut self) {
524 rmp::encode::write_nil(&mut self.w).unwrap()
525 }
526 pub fn serialize_bool(&mut self, v: bool) {
527 rmp::encode::write_bool(&mut self.w, v).unwrap()
528 }
529 pub fn serialize_int(&mut self, v: Int) {
530 if let Ok(v) = i64::try_from(v) {
531 rmp::encode::write_sint(&mut self.w, v).unwrap();
532 } else {
533 rmp::encode::write_uint(&mut self.w, u64::try_from(v).unwrap()).unwrap();
534 }
535 }
536 pub fn serialize_f32(&mut self, v: f32) {
537 rmp::encode::write_f32(&mut self.w, v).unwrap();
538 }
539 pub fn serialize_f64(&mut self, v: f64) {
540 rmp::encode::write_f64(&mut self.w, v).unwrap();
541 }
542 pub fn serialize_str(&mut self, v: &[u8]) {
543 rmp::encode::write_str_len(&mut self.w, v.len() as u32).unwrap();
544 self.w.write_all(v).unwrap();
545 }
546 pub fn serialize_bin(&mut self, v: &[u8]) {
547 rmp::encode::write_bin(&mut self.w, v).unwrap();
548 }
549 pub fn serialize_array(&mut self, len: u32) {
550 rmp::encode::write_array_len(&mut self.w, len).unwrap();
551 }
552 pub fn serialize_map(&mut self, len: u32) {
553 rmp::encode::write_map_len(&mut self.w, len).unwrap();
554 }
555 pub fn serialize_ext(&mut self, tag: i8, data: &[u8]) {
556 rmp::encode::write_ext_meta(&mut self.w, data.len() as u32, tag).unwrap();
557 self.w.write_all(data).unwrap();
558 }
559
560 pub fn serialize<S: Serialize>(&mut self, s: S) {
562 S::serialize(&s, self)
563 }
564}
565
566pub trait Serialize {
567 fn serialize(&self, serializer: &mut Serializer);
568}
569
570impl<T: Serialize> Serialize for &T {
571 fn serialize(&self, serializer: &mut Serializer) {
572 T::serialize(*self, serializer)
573 }
574}
575
576impl Serialize for bool {
577 fn serialize(&self, serializer: &mut Serializer) {
578 serializer.serialize_bool(*self)
579 }
580}
581
582impl Serialize for Int {
583 fn serialize(&self, serializer: &mut Serializer) {
584 serializer.serialize_int(*self)
585 }
586}
587
588impl Serialize for u8 {
589 fn serialize(&self, serializer: &mut Serializer) {
590 serializer.serialize_int(Int::from(*self))
591 }
592}
593
594impl Serialize for u16 {
595 fn serialize(&self, serializer: &mut Serializer) {
596 serializer.serialize_int(Int::from(*self))
597 }
598}
599
600impl Serialize for u32 {
601 fn serialize(&self, serializer: &mut Serializer) {
602 serializer.serialize_int(Int::from(*self))
603 }
604}
605
606impl Serialize for u64 {
607 fn serialize(&self, serializer: &mut Serializer) {
608 serializer.serialize_int(Int::from(*self))
609 }
610}
611
612impl Serialize for i8 {
613 fn serialize(&self, serializer: &mut Serializer) {
614 serializer.serialize_int(Int::from(*self))
615 }
616}
617
618impl Serialize for i16 {
619 fn serialize(&self, serializer: &mut Serializer) {
620 serializer.serialize_int(Int::from(*self))
621 }
622}
623
624impl Serialize for i32 {
625 fn serialize(&self, serializer: &mut Serializer) {
626 serializer.serialize_int(Int::from(*self))
627 }
628}
629
630impl Serialize for i64 {
631 fn serialize(&self, serializer: &mut Serializer) {
632 serializer.serialize_int(Int::from(*self))
633 }
634}
635
636impl Serialize for f32 {
637 fn serialize(&self, serializer: &mut Serializer) {
638 serializer.serialize_f32(*self)
639 }
640}
641
642impl Serialize for f64 {
643 fn serialize(&self, serializer: &mut Serializer) {
644 serializer.serialize_f64(*self)
645 }
646}
647
648impl Serialize for Str {
649 fn serialize(&self, serializer: &mut Serializer) {
650 serializer.serialize_str(&self.0)
651 }
652}
653
654impl Serialize for str {
655 fn serialize(&self, serializer: &mut Serializer) {
656 serializer.serialize_str(self.as_bytes())
657 }
658}
659
660impl Serialize for String {
661 fn serialize(&self, serializer: &mut Serializer) {
662 serializer.serialize_str(self.as_bytes())
663 }
664}
665
666impl<T: Serialize> Serialize for [T] {
667 fn serialize(&self, serializer: &mut Serializer) {
668 serializer.serialize_array(self.len() as u32);
669 for x in self {
670 serializer.serialize(x);
671 }
672 }
673}
674
675impl<T: Serialize> Serialize for Vec<T> {
676 fn serialize(&self, serializer: &mut Serializer) {
677 serializer.serialize_array(self.len() as u32);
678 for x in self {
679 serializer.serialize(x);
680 }
681 }
682}
683
684impl<T: Serialize> Serialize for Box<T> {
685 fn serialize(&self, serializer: &mut Serializer) {
686 serializer.serialize(&**self);
687 }
688}
689
690impl<T: Serialize> Serialize for std::rc::Rc<T> {
691 fn serialize(&self, serializer: &mut Serializer) {
692 serializer.serialize(&**self);
693 }
694}
695
696impl<T: Serialize> Serialize for std::sync::Arc<T> {
697 fn serialize(&self, serializer: &mut Serializer) {
698 serializer.serialize(&**self);
699 }
700}
701
702#[doc(hidden)]
703pub trait StructSerialize: Serialize {
704 fn count_fields(&self) -> u32;
705 fn serialize_fields(&self, serializer: &mut Serializer);
706}
707
708#[derive(Debug, Clone, PartialEq)]
709pub enum Token<'a> {
710 Nil,
711 Bool(bool),
712 Int(Int),
713 F32(f32),
714 F64(f64),
715 Str(&'a [u8]),
716 Bin(&'a [u8]),
717 Array(u32),
718 Map(u32),
719 Ext { tag: i8, data: &'a [u8] },
720}
721
722#[derive(Debug, Error)]
728#[error("invalid input")]
729pub struct InvalidInputError;
730
731#[derive(Clone, Copy)]
733pub struct Deserializer<'a> {
734 r: &'a [u8],
735}
736
737impl<'a> Deserializer<'a> {
738 fn new(r: &'a [u8]) -> Self {
739 Self { r }
740 }
741
742 pub fn deserialize_token(&mut self) -> Result<Token, InvalidInputError> {
743 let token = match rmp::decode::read_marker(&mut self.r).map_err(|_| InvalidInputError)? {
744 rmp::Marker::Null => Token::Nil,
745 rmp::Marker::True => Token::Bool(true),
746 rmp::Marker::False => Token::Bool(false),
747 rmp::Marker::FixPos(v) => Token::Int(Int::from(v)),
748 rmp::Marker::FixNeg(v) => Token::Int(Int::from(v)),
749 rmp::Marker::U8 => {
750 Token::Int(Int::from(self.r.read_u8().map_err(|_| InvalidInputError)?))
751 }
752 rmp::Marker::U16 => Token::Int(Int::from(
753 self.r
754 .read_u16::<BigEndian>()
755 .map_err(|_| InvalidInputError)?,
756 )),
757 rmp::Marker::U32 => Token::Int(Int::from(
758 self.r
759 .read_u32::<BigEndian>()
760 .map_err(|_| InvalidInputError)?,
761 )),
762 rmp::Marker::U64 => Token::Int(Int::from(
763 self.r
764 .read_u64::<BigEndian>()
765 .map_err(|_| InvalidInputError)?,
766 )),
767 rmp::Marker::I8 => {
768 Token::Int(Int::from(self.r.read_i8().map_err(|_| InvalidInputError)?))
769 }
770 rmp::Marker::I16 => Token::Int(Int::from(
771 self.r
772 .read_i16::<BigEndian>()
773 .map_err(|_| InvalidInputError)?,
774 )),
775 rmp::Marker::I32 => Token::Int(Int::from(
776 self.r
777 .read_i32::<BigEndian>()
778 .map_err(|_| InvalidInputError)?,
779 )),
780 rmp::Marker::I64 => Token::Int(Int::from(
781 self.r
782 .read_i64::<BigEndian>()
783 .map_err(|_| InvalidInputError)?,
784 )),
785 rmp::Marker::F32 => Token::F32(
786 self.r
787 .read_f32::<BigEndian>()
788 .map_err(|_| InvalidInputError)?,
789 ),
790 rmp::Marker::F64 => Token::F64(
791 self.r
792 .read_f64::<BigEndian>()
793 .map_err(|_| InvalidInputError)?,
794 ),
795 rmp::Marker::FixStr(len) => {
796 let len = len as usize;
797 let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
798 self.r = self.r.get(len..).unwrap();
799 Token::Str(ret)
800 }
801 rmp::Marker::Str8 => {
802 let len = self.r.read_u8().map_err(|_| InvalidInputError)? as usize;
803 let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
804 self.r = self.r.get(len..).unwrap();
805 Token::Str(ret)
806 }
807 rmp::Marker::Str16 => {
808 let len = self
809 .r
810 .read_u16::<BigEndian>()
811 .map_err(|_| InvalidInputError)? as usize;
812 let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
813 self.r = self.r.get(len..).unwrap();
814 Token::Str(ret)
815 }
816 rmp::Marker::Str32 => {
817 let len = self
818 .r
819 .read_u32::<BigEndian>()
820 .map_err(|_| InvalidInputError)? as usize;
821 let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
822 self.r = self.r.get(len..).unwrap();
823 Token::Str(ret)
824 }
825 rmp::Marker::Bin8 => {
826 let len = self.r.read_u8().map_err(|_| InvalidInputError)? as usize;
827 let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
828 self.r = self.r.get(len..).unwrap();
829 Token::Bin(ret)
830 }
831 rmp::Marker::Bin16 => {
832 let len = self
833 .r
834 .read_u16::<BigEndian>()
835 .map_err(|_| InvalidInputError)? as usize;
836 let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
837 self.r = self.r.get(len..).unwrap();
838 Token::Bin(ret)
839 }
840 rmp::Marker::Bin32 => {
841 let len = self
842 .r
843 .read_u32::<BigEndian>()
844 .map_err(|_| InvalidInputError)? as usize;
845 let ret = self.r.get(0..len).ok_or(InvalidInputError)?;
846 self.r = self.r.get(len..).unwrap();
847 Token::Bin(ret)
848 }
849 rmp::Marker::FixArray(len) => Token::Array(len as u32),
850 rmp::Marker::Array16 => Token::Array(
851 self.r
852 .read_u16::<BigEndian>()
853 .map_err(|_| InvalidInputError)? as u32,
854 ),
855 rmp::Marker::Array32 => Token::Array(
856 self.r
857 .read_u32::<BigEndian>()
858 .map_err(|_| InvalidInputError)?,
859 ),
860 rmp::Marker::FixMap(len) => Token::Map(len as u32),
861 rmp::Marker::Map16 => Token::Map(
862 self.r
863 .read_u16::<BigEndian>()
864 .map_err(|_| InvalidInputError)? as u32,
865 ),
866 rmp::Marker::Map32 => Token::Map(
867 self.r
868 .read_u32::<BigEndian>()
869 .map_err(|_| InvalidInputError)?,
870 ),
871 rmp::Marker::FixExt1 => {
872 let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
873 let data = self.r.get(0..1).ok_or(InvalidInputError)?;
874 self.r = self.r.get(1..).unwrap();
875 Token::Ext { tag, data }
876 }
877 rmp::Marker::FixExt2 => {
878 let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
879 let data = self.r.get(0..2).ok_or(InvalidInputError)?;
880 self.r = self.r.get(2..).unwrap();
881 Token::Ext { tag, data }
882 }
883 rmp::Marker::FixExt4 => {
884 let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
885 let data = self.r.get(0..4).ok_or(InvalidInputError)?;
886 self.r = self.r.get(4..).unwrap();
887 Token::Ext { tag, data }
888 }
889 rmp::Marker::FixExt8 => {
890 let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
891 let data = self.r.get(0..8).ok_or(InvalidInputError)?;
892 self.r = self.r.get(8..).unwrap();
893 Token::Ext { tag, data }
894 }
895 rmp::Marker::FixExt16 => {
896 let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
897 let data = self.r.get(0..16).ok_or(InvalidInputError)?;
898 self.r = self.r.get(16..).unwrap();
899 Token::Ext { tag, data }
900 }
901 rmp::Marker::Ext8 => {
902 let len = self.r.read_u8().map_err(|_| InvalidInputError)? as usize;
903 let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
904 let data = self.r.get(0..len).ok_or(InvalidInputError)?;
905 self.r = self.r.get(len..).unwrap();
906 Token::Ext { tag, data }
907 }
908 rmp::Marker::Ext16 => {
909 let len = self
910 .r
911 .read_u16::<BigEndian>()
912 .map_err(|_| InvalidInputError)? as usize;
913 let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
914 let data = self.r.get(0..len).ok_or(InvalidInputError)?;
915 self.r = self.r.get(len..).unwrap();
916 Token::Ext { tag, data }
917 }
918 rmp::Marker::Ext32 => {
919 let len = self
920 .r
921 .read_u32::<BigEndian>()
922 .map_err(|_| InvalidInputError)? as usize;
923 let tag = self.r.read_i8().map_err(|_| InvalidInputError)?;
924 let data = self.r.get(0..len).ok_or(InvalidInputError)?;
925 self.r = self.r.get(len..).unwrap();
926 Token::Ext { tag, data }
927 }
928 rmp::Marker::Reserved => return Err(InvalidInputError),
929 };
930 Ok(token)
931 }
932
933 pub fn deserialize<D: Deserialize>(&mut self) -> Result<D, DeserializeError> {
935 D::deserialize(self)
936 }
937
938 pub fn try_deserialize<D: Deserialize>(&mut self) -> Result<Option<D>, InvalidInputError> {
943 let mut branch = *self;
944 match branch.deserialize() {
945 Ok(v) => {
946 *self = branch;
947 Ok(Some(v))
948 }
949 Err(DeserializeError::Validation(_)) => Ok(None),
950 Err(DeserializeError::InvalidInput(err)) => Err(err),
951 }
952 }
953
954 pub fn deserialize_any(&mut self) -> Result<(), DeserializeError> {
956 let mut count = 1;
957 while count > 0 {
958 count -= 1;
959 match self.deserialize_token()? {
960 Token::Nil
961 | Token::Bool(_)
962 | Token::Int(_)
963 | Token::F32(_)
964 | Token::F64(_)
965 | Token::Str(_)
966 | Token::Bin(_)
967 | Token::Ext { .. } => {}
968 Token::Array(len) => {
969 count += len;
970 }
971 Token::Map(len) => {
972 count += len * 2;
973 }
974 }
975 }
976 Ok(())
977 }
978}
979
980#[derive(Debug, Error)]
982#[error("validation failed")]
983pub struct ValidationError;
984
985#[derive(Debug, Error)]
987pub enum DeserializeError {
988 #[error(transparent)]
989 InvalidInput(#[from] InvalidInputError),
990 #[error(transparent)]
991 Validation(#[from] ValidationError),
992}
993
994pub trait Deserialize: Sized {
995 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError>;
996}
997
998impl Deserialize for bool {
999 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1000 if let Token::Bool(v) = deserializer.deserialize_token()? {
1001 return Ok(v);
1002 }
1003 Err(ValidationError.into())
1004 }
1005}
1006
1007impl Deserialize for Int {
1008 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1009 if let Token::Int(v) = deserializer.deserialize_token()? {
1010 return Ok(v);
1011 }
1012 Err(ValidationError.into())
1013 }
1014}
1015
1016impl Deserialize for u8 {
1017 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1018 deserializer
1019 .deserialize::<Int>()?
1020 .try_into()
1021 .map_err(|_| ValidationError.into())
1022 }
1023}
1024
1025impl Deserialize for u16 {
1026 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1027 deserializer
1028 .deserialize::<Int>()?
1029 .try_into()
1030 .map_err(|_| ValidationError.into())
1031 }
1032}
1033
1034impl Deserialize for u32 {
1035 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1036 deserializer
1037 .deserialize::<Int>()?
1038 .try_into()
1039 .map_err(|_| ValidationError.into())
1040 }
1041}
1042
1043impl Deserialize for u64 {
1044 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1045 deserializer
1046 .deserialize::<Int>()?
1047 .try_into()
1048 .map_err(|_| ValidationError.into())
1049 }
1050}
1051
1052impl Deserialize for i8 {
1053 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1054 deserializer
1055 .deserialize::<Int>()?
1056 .try_into()
1057 .map_err(|_| ValidationError.into())
1058 }
1059}
1060
1061impl Deserialize for i16 {
1062 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1063 deserializer
1064 .deserialize::<Int>()?
1065 .try_into()
1066 .map_err(|_| ValidationError.into())
1067 }
1068}
1069
1070impl Deserialize for i32 {
1071 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1072 deserializer
1073 .deserialize::<Int>()?
1074 .try_into()
1075 .map_err(|_| ValidationError.into())
1076 }
1077}
1078
1079impl Deserialize for i64 {
1080 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1081 deserializer
1082 .deserialize::<Int>()?
1083 .try_into()
1084 .map_err(|_| ValidationError.into())
1085 }
1086}
1087
1088impl Deserialize for f32 {
1089 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1090 if let Token::F32(v) = deserializer.deserialize_token()? {
1091 return Ok(v);
1092 }
1093 Err(ValidationError.into())
1094 }
1095}
1096
1097impl Deserialize for f64 {
1098 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1099 if let Token::F64(v) = deserializer.deserialize_token()? {
1100 return Ok(v);
1101 }
1102 Err(ValidationError.into())
1103 }
1104}
1105
1106impl Deserialize for Str {
1107 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1108 if let Token::Str(v) = deserializer.deserialize_token()? {
1109 return Ok(Str(v.to_vec()));
1110 }
1111 Err(ValidationError.into())
1112 }
1113}
1114
1115impl Deserialize for String {
1116 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1117 let Str(data) = deserializer.deserialize()?;
1118 let v = String::from_utf8(data).map_err(|_| ValidationError)?;
1119 Ok(v)
1120 }
1121}
1122
1123impl<T: Deserialize> Deserialize for Vec<T> {
1124 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1125 if let Token::Array(len) = deserializer.deserialize_token()? {
1126 let mut vec = Vec::with_capacity(len as usize);
1127 for _ in 0..len {
1128 vec.push(deserializer.deserialize()?);
1129 }
1130 return Ok(vec);
1131 }
1132 Err(ValidationError.into())
1133 }
1134}
1135
1136impl<T: Deserialize> Deserialize for Box<T> {
1137 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1138 Ok(Box::new(deserializer.deserialize()?))
1139 }
1140}
1141
1142impl<T: Deserialize> Deserialize for std::rc::Rc<T> {
1143 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1144 Ok(Self::new(deserializer.deserialize()?))
1145 }
1146}
1147
1148impl<T: Deserialize> Deserialize for std::sync::Arc<T> {
1149 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1150 Ok(Self::new(deserializer.deserialize()?))
1151 }
1152}
1153
1154pub fn serialize<S: Serialize>(s: S) -> Vec<u8> {
1156 let mut serializer = Serializer::new();
1157 serializer.serialize(s);
1158 serializer.into_inner()
1159}
1160
1161pub fn serialize_into<S: Serialize>(s: S, buf: &mut Vec<u8>) {
1165 let v = std::mem::take(buf);
1166 let mut serializer = Serializer::with_vec(v);
1167 serializer.serialize(s);
1168 *buf = serializer.into_inner();
1169}
1170
1171pub fn deserialize<D: Deserialize>(r: &[u8]) -> Result<D, DeserializeError> {
1176 let mut deserializer = Deserializer::new(r);
1177 deserializer.deserialize()
1178}
1179
1180#[test]
1181fn deserialize_ignores_extra_bytes() {
1182 let input: Vec<u8> = vec![0x01, 0xc1];
1183 let v: Int = deserialize(&input).unwrap();
1184 assert_eq!(v, Int::from(1u32));
1185}
1186
1187impl Serialize for Value {
1188 fn serialize(&self, serializer: &mut Serializer) {
1189 match self {
1190 Value::Nil => serializer.serialize_nil(),
1191 Value::Bool(v) => serializer.serialize_bool(*v),
1192 Value::Int(v) => serializer.serialize_int(*v),
1193 Value::F32(v) => serializer.serialize_f32(*v),
1194 Value::F64(v) => serializer.serialize_f64(*v),
1195 Value::Str(v) => serializer.serialize_str(&v.0),
1196 Value::Bin(v) => serializer.serialize_bin(&v.0),
1197 Value::Array(v) => {
1198 serializer.serialize_array(v.len() as u32);
1199 for x in v {
1200 serializer.serialize(x);
1201 }
1202 }
1203 Value::Map(v) => {
1204 serializer.serialize_map(v.len() as u32);
1205 for (k, v) in v {
1206 serializer.serialize(k);
1207 serializer.serialize(v);
1208 }
1209 }
1210 Value::Ext(v) => serializer.serialize_ext(v.r#type, &v.data),
1211 }
1212 }
1213}
1214
1215impl Deserialize for Value {
1216 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1217 let x = match deserializer.deserialize_token()? {
1218 Token::Nil => Value::Nil,
1219 Token::Bool(v) => v.into(),
1220 Token::Int(v) => v.into(),
1221 Token::F32(v) => v.into(),
1222 Token::F64(v) => v.into(),
1223 Token::Str(v) => Str(v.to_vec()).into(),
1224 Token::Bin(v) => Bin(v.to_vec()).into(),
1225 Token::Array(len) => {
1226 let mut vec: Vec<Value> = vec![];
1227 for _ in 0..len {
1228 vec.push(deserializer.deserialize()?);
1229 }
1230 vec.into()
1231 }
1232 Token::Map(len) => {
1233 let mut map: Vec<(Value, Value)> = vec![];
1234 for _ in 0..len {
1235 map.push((deserializer.deserialize()?, deserializer.deserialize()?));
1236 }
1237 map.into()
1238 }
1239 Token::Ext { tag, data } => Ext {
1240 r#type: tag,
1241 data: data.to_vec(),
1242 }
1243 .into(),
1244 };
1245 Ok(x)
1246 }
1247}
1248
1249#[doc(hidden)]
1251pub mod value {
1252 use super::*;
1253
1254 pub use msgpack_value::{Bin, Ext, Int, Str, Value};
1255
1256 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
1261 pub struct Nil;
1262
1263 impl Serialize for Nil {
1264 fn serialize(&self, serializer: &mut Serializer) {
1265 serializer.serialize_nil()
1266 }
1267 }
1268
1269 impl Deserialize for Nil {
1270 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1271 let token = deserializer.deserialize_token()?;
1272 if token != Token::Nil {
1273 return Err(ValidationError.into());
1274 }
1275 Ok(Self)
1276 }
1277 }
1278
1279 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
1281 pub struct Any;
1282
1283 impl Deserialize for Any {
1284 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1285 deserializer.deserialize_any()?;
1286 Ok(Any)
1287 }
1288 }
1289
1290 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
1292 pub struct Empty {}
1293
1294 impl Serialize for Empty {
1295 fn serialize(&self, serializer: &mut Serializer) {
1296 serializer.serialize_map(0)
1297 }
1298 }
1299
1300 impl Deserialize for Empty {
1301 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1302 let token = deserializer.deserialize_token()?;
1303 if token != Token::Map(0) {
1304 return Err(ValidationError.into());
1305 }
1306 Ok(Self {})
1307 }
1308 }
1309}
1310
1311#[cfg(test)]
1312mod tests {
1313 use super::*;
1314 use msgpack_value::msgpack;
1315 use proptest::prelude::*;
1316 use proptest_derive::Arbitrary;
1317
1318 macro_rules! roundtrip {
1319 ($name:ident, $ty:ty) => {
1320 #[cfg(test)]
1321 mod $name {
1322 use super::*;
1323 proptest! {
1324 #[test]
1325 fn test(v: $ty) {
1326 assert_eq!(v, deserialize::<$ty>(serialize(&v).as_slice()).unwrap());
1327 }
1328 }
1329 }
1330 };
1331 }
1332
1333 roundtrip!(roundtrip_bool, bool);
1334 roundtrip!(roundtrip_i8, i8);
1335 roundtrip!(roundtrip_i16, i16);
1336 roundtrip!(roundtrip_i32, i32);
1337 roundtrip!(roundtrip_i64, i64);
1338 roundtrip!(roundtrip_u8, u8);
1339 roundtrip!(roundtrip_u16, u16);
1340 roundtrip!(roundtrip_u32, u32);
1341 roundtrip!(roundtrip_u64, u64);
1342 roundtrip!(roundtrip_f32, f32);
1343 roundtrip!(roundtrip_f64, f64);
1344 roundtrip!(roundtrip_str, String);
1345 roundtrip!(roundtrip_blob, Vec<i32>);
1346 roundtrip!(roundtrip_box, Box<i32>);
1347 roundtrip!(roundtrip_rc, std::rc::Rc<i32>);
1348 roundtrip!(roundtrip_arc, std::sync::Arc<i32>);
1349
1350 roundtrip!(roundtrip_value, Value);
1351 roundtrip!(roundtrip_int, Int);
1352
1353 #[derive(Debug, PartialEq, Eq, Arbitrary)]
1354 struct Human {
1355 age: u32,
1356 name: String,
1357 }
1358
1359 impl Serialize for Human {
1360 fn serialize(&self, serializer: &mut Serializer) {
1361 serializer.serialize_map(2);
1362 serializer.serialize(0u32);
1363 serializer.serialize(self.age);
1364 serializer.serialize(1u32);
1365 serializer.serialize(&self.name);
1366 }
1367 }
1368
1369 impl Deserialize for Human {
1370 fn deserialize(deserializer: &mut Deserializer) -> Result<Self, DeserializeError> {
1371 let len = match deserializer.deserialize_token()? {
1372 Token::Map(len) => len,
1373 _ => return Err(ValidationError.into()),
1374 };
1375
1376 let mut age: Option<u32> = None;
1377 let mut name: Option<String> = None;
1378 for _ in 0..len {
1379 let tag: u32 = deserializer.deserialize()?;
1380 match tag {
1381 0 => {
1382 if age.is_some() {
1383 return Err(InvalidInputError.into());
1384 }
1385 age = Some(deserializer.deserialize()?);
1386 }
1387 1 => {
1388 if name.is_some() {
1389 return Err(InvalidInputError.into());
1390 }
1391 name = Some(deserializer.deserialize()?);
1392 }
1393 _ => {
1394 deserializer.deserialize_any()?;
1395 }
1396 }
1397 }
1398 Ok(Self {
1399 age: age.ok_or(ValidationError)?,
1400 name: name.ok_or(ValidationError)?,
1401 })
1402 }
1403 }
1404
1405 roundtrip!(roundtrip_human, Human);
1406
1407 fn check_serialize_result<T: Serialize>(x: T, v: Value) {
1408 let buf1 = serialize(&x);
1409 let buf2 = serialize(v);
1410 assert_eq!(buf1, buf2);
1411 }
1412
1413 #[test]
1414 fn struct_vs_value() {
1415 check_serialize_result(
1416 Human {
1417 age: 42,
1418 name: "John".into(),
1419 },
1420 msgpack!({
1421 0: 42,
1422 1: "John",
1423 }),
1424 );
1425 }
1426
1427 #[test]
1428 fn box_vs_value() {
1429 check_serialize_result(Box::new(42i32), msgpack!(42));
1430 }
1431
1432 #[test]
1433 fn rc_vs_value() {
1434 check_serialize_result(std::rc::Rc::new(42i32), msgpack!(42));
1435 }
1436
1437 #[test]
1438 fn arc_vs_value() {
1439 check_serialize_result(std::sync::Arc::new(42i32), msgpack!(42));
1440 }
1441
1442 #[test]
1443 fn serialize_into_keeps_buf() {
1444 let mut buf = vec![0x12, 0x34, 0x56, 0x78];
1445 serialize_into(42, &mut buf);
1446 assert_eq!(*buf, [0x12, 0x34, 0x56, 0x78, 42]);
1447 }
1448}