From ebc61baab2c6ad2ed334c2856c3efad7d4db1b5d Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sun, 18 Mar 2018 13:02:00 +0100 Subject: [PATCH] Added newtype struct support for flattening --- serde/src/private/de.rs | 15 +++++++++++++-- serde/src/private/ser.rs | 7 ++----- test_suite/tests/test_annotations.rs | 15 ++++++++++----- 3 files changed, 25 insertions(+), 12 deletions(-) diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index 80e7e8c7..7cb3152d 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -2143,10 +2143,21 @@ impl<'a, 'de, E> Deserializer<'de> for FlatMapDeserializer<'a, 'de, E> visitor.visit_map(FlatMapAccess::new(self.0.iter_mut(), Some(fields))) } + fn deserialize_newtype_struct( + self, + _name: &str, + visitor: V, + ) -> Result + where + V: Visitor<'de>, + { + visitor.visit_newtype_struct(self) + } + forward_to_deserialize_any! { bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes - byte_buf option unit unit_struct newtype_struct seq tuple - tuple_struct identifier ignored_any + byte_buf option unit unit_struct seq tuple tuple_struct identifier + ignored_any } } diff --git a/serde/src/private/ser.rs b/serde/src/private/ser.rs index 91dfcce7..cac2bf41 100644 --- a/serde/src/private/ser.rs +++ b/serde/src/private/ser.rs @@ -64,7 +64,6 @@ enum Unsupported { Optional, Unit, UnitStruct, - NewtypeStruct, Sequence, Tuple, TupleStruct, @@ -83,7 +82,6 @@ impl Display for Unsupported { Unsupported::Optional => formatter.write_str("an optional"), Unsupported::Unit => formatter.write_str("unit"), Unsupported::UnitStruct => formatter.write_str("unit struct"), - Unsupported::NewtypeStruct => formatter.write_str("newtype struct"), Unsupported::Sequence => formatter.write_str("a sequence"), Unsupported::Tuple => formatter.write_str("a tuple"), Unsupported::TupleStruct => formatter.write_str("a tuple struct"), @@ -1153,13 +1151,12 @@ impl<'a, M> Serializer for FlatMapSerializer<'a, M> fn serialize_newtype_struct( self, _: &'static str, - _value: &T, + value: &T, ) -> Result where T: Serialize, { - // TODO: can we do better here? - Err(self.bad_type(Unsupported::NewtypeStruct)) + value.serialize(self) } fn serialize_newtype_variant( diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 57b211a6..be0b4e03 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -127,9 +127,12 @@ enum FlattenStructEnum { struct FlattenStructTagContentEnumWrapper { outer: u32, #[serde(flatten)] - data: FlattenStructTagContentEnum, + data: FlattenStructTagContentEnumNewtype, } +#[derive(Debug, PartialEq, Serialize, Deserialize)] +struct FlattenStructTagContentEnumNewtype(pub FlattenStructTagContentEnum); + #[derive(Debug, PartialEq, Serialize, Deserialize)] #[serde(rename_all = "snake_case", tag = "type", content = "value")] enum FlattenStructTagContentEnum { @@ -1394,10 +1397,12 @@ fn test_flatten_struct_enum() { fn test_flatten_struct_tag_content_enum() { let change_request = FlattenStructTagContentEnumWrapper { outer: 42, - data: FlattenStructTagContentEnum::InsertInteger { - index: 0, - value: 42 - }, + data: FlattenStructTagContentEnumNewtype( + FlattenStructTagContentEnum::InsertInteger { + index: 0, + value: 42 + } + ), }; assert_de_tokens( &change_request,