11use crate :: error:: Error ;
22use crate :: token:: Token ;
3- use serde:: de:: value:: { MapAccessDeserializer , SeqAccessDeserializer } ;
3+ use serde:: de:: value:: {
4+ BorrowedBytesDeserializer , BorrowedStrDeserializer , MapAccessDeserializer ,
5+ SeqAccessDeserializer ,
6+ } ;
47use serde:: de:: {
58 self , Deserialize , DeserializeSeed , EnumAccess , IntoDeserializer , MapAccess , SeqAccess ,
69 VariantAccess , Visitor ,
@@ -598,10 +601,28 @@ impl<'de, 'a> MapAccess<'de> for EnumMapVisitor<'a, 'de> {
598601 {
599602 match self . variant . take ( ) {
600603 Some ( Token :: Str ( variant) ) => seed. deserialize ( variant. into_deserializer ( ) ) . map ( Some ) ,
604+ Some ( Token :: BorrowedStr ( variant) ) => seed
605+ . deserialize ( BorrowedStrDeserializer :: new ( variant) )
606+ . map ( Some ) ,
607+ Some ( Token :: String ( variant) ) => seed
608+ . deserialize ( StringDeserializer { value : variant } )
609+ . map ( Some ) ,
610+
601611 Some ( Token :: Bytes ( variant) ) => seed
612+ . deserialize ( BorrowedBytesDeserializer :: new ( variant) )
613+ . map ( Some ) ,
614+ Some ( Token :: BorrowedBytes ( variant) ) => seed
602615 . deserialize ( BytesDeserializer { value : variant } )
603616 . map ( Some ) ,
617+ Some ( Token :: ByteBuf ( variant) ) => seed
618+ . deserialize ( ByteBufDeserializer { value : variant } )
619+ . map ( Some ) ,
620+
621+ Some ( Token :: U8 ( variant) ) => seed. deserialize ( variant. into_deserializer ( ) ) . map ( Some ) ,
622+ Some ( Token :: U16 ( variant) ) => seed. deserialize ( variant. into_deserializer ( ) ) . map ( Some ) ,
604623 Some ( Token :: U32 ( variant) ) => seed. deserialize ( variant. into_deserializer ( ) ) . map ( Some ) ,
624+ Some ( Token :: U64 ( variant) ) => seed. deserialize ( variant. into_deserializer ( ) ) . map ( Some ) ,
625+
605626 Some ( other) => Err ( unexpected ( other) ) ,
606627 None => Ok ( None ) ,
607628 }
@@ -641,6 +662,7 @@ impl<'de, 'a> MapAccess<'de> for EnumMapVisitor<'a, 'de> {
641662 }
642663}
643664
665+ /// `BytesDeserializer` in serde available only since v1.0.121
644666struct BytesDeserializer {
645667 value : & ' static [ u8 ] ,
646668}
@@ -661,3 +683,47 @@ impl<'de> de::Deserializer<'de> for BytesDeserializer {
661683 tuple_struct map struct enum identifier ignored_any
662684 }
663685}
686+
687+ /// `StringDeserializer` in serde available only since v1.0.139 and makes unwanted
688+ /// conversions in `visit_enum`
689+ struct StringDeserializer {
690+ value : & ' static str ,
691+ }
692+
693+ impl < ' de > de:: Deserializer < ' de > for StringDeserializer {
694+ type Error = Error ;
695+
696+ fn deserialize_any < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
697+ where
698+ V : de:: Visitor < ' de > ,
699+ {
700+ visitor. visit_string ( self . value . to_string ( ) )
701+ }
702+
703+ forward_to_deserialize_any ! {
704+ bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
705+ bytes byte_buf option unit unit_struct newtype_struct seq tuple
706+ tuple_struct map struct enum identifier ignored_any
707+ }
708+ }
709+
710+ struct ByteBufDeserializer {
711+ value : & ' static [ u8 ] ,
712+ }
713+
714+ impl < ' de > de:: Deserializer < ' de > for ByteBufDeserializer {
715+ type Error = Error ;
716+
717+ fn deserialize_any < V > ( self , visitor : V ) -> Result < V :: Value , Self :: Error >
718+ where
719+ V : de:: Visitor < ' de > ,
720+ {
721+ visitor. visit_byte_buf ( self . value . to_vec ( ) )
722+ }
723+
724+ forward_to_deserialize_any ! {
725+ bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
726+ bytes byte_buf option unit unit_struct newtype_struct seq tuple
727+ tuple_struct map struct enum identifier ignored_any
728+ }
729+ }
0 commit comments