@@ -5,7 +5,7 @@ use core::{fmt, str};
55
66use serde:: de:: { self , Visitor } ;
77
8- use self :: enum_:: UnitVariantAccess ;
8+ use self :: enum_:: { UnitVariantAccess , VariantAccess } ;
99use self :: map:: MapAccess ;
1010use self :: seq:: SeqAccess ;
1111
@@ -585,6 +585,17 @@ impl<'a, 'de> de::Deserializer<'de> for &'a mut Deserializer<'de> {
585585 {
586586 match self . parse_whitespace ( ) . ok_or ( Error :: EofWhileParsingValue ) ? {
587587 b'"' => visitor. visit_enum ( UnitVariantAccess :: new ( self ) ) ,
588+ b'{' => {
589+ self . eat_char ( ) ;
590+ let value = visitor. visit_enum ( VariantAccess :: new ( self ) ) ?;
591+ match self . parse_whitespace ( ) . ok_or ( Error :: EofWhileParsingValue ) ? {
592+ b'}' => {
593+ self . eat_char ( ) ;
594+ Ok ( value)
595+ }
596+ _ => Err ( Error :: ExpectedSomeValue ) ,
597+ }
598+ } ,
588599 _ => Err ( Error :: ExpectedSomeValue ) ,
589600 }
590601 }
@@ -890,6 +901,11 @@ mod tests {
890901 assert ! ( crate :: from_str:: <Temperature >( r#"{ "temperature": -1 }"# ) . is_err( ) ) ;
891902 }
892903
904+ #[ test]
905+ fn test_unit ( ) {
906+ assert_eq ! ( crate :: from_str:: <( ) >( r#"null"# ) . unwrap( ) , ( ) ) ;
907+ }
908+
893909 #[ test]
894910 fn newtype_struct ( ) {
895911 #[ derive( Deserialize , Debug , PartialEq ) ]
@@ -898,6 +914,28 @@ mod tests {
898914 assert_eq ! ( crate :: from_str:: <A >( r#"54"# ) . unwrap( ) , A ( 54 ) ) ;
899915 }
900916
917+ #[ test]
918+ fn test_newtype_variant ( ) {
919+ #[ derive( Deserialize , Debug , PartialEq ) ]
920+ enum A {
921+ A ( u32 ) ,
922+ }
923+ let a = A :: A ( 54 ) ;
924+ let x = crate :: from_str :: < A > ( r#"{"A":54}"# ) ;
925+ assert_eq ! ( x, Ok ( a) ) ;
926+ }
927+
928+ #[ test]
929+ fn test_struct_variant ( ) {
930+ #[ derive( Deserialize , Debug , PartialEq ) ]
931+ enum A {
932+ A { x : u32 , y : u16 } ,
933+ }
934+ let a = A :: A { x : 54 , y : 720 } ;
935+ let x = crate :: from_str :: < A > ( r#"{"A": {"x":54,"y":720 } }"# ) ;
936+ assert_eq ! ( x, Ok ( a) ) ;
937+ }
938+
901939 #[ test]
902940 #[ cfg( not( feature = "custom-error-messages" ) ) ]
903941 fn struct_tuple ( ) {
0 commit comments