Added newtype struct support for flattening

This commit is contained in:
Armin Ronacher 2018-03-18 13:02:00 +01:00
parent ffcde25b6e
commit ebc61baab2
3 changed files with 25 additions and 12 deletions

View File

@ -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))) visitor.visit_map(FlatMapAccess::new(self.0.iter_mut(), Some(fields)))
} }
fn deserialize_newtype_struct<V>(
self,
_name: &str,
visitor: V,
) -> Result<V::Value, Self::Error>
where
V: Visitor<'de>,
{
visitor.visit_newtype_struct(self)
}
forward_to_deserialize_any! { forward_to_deserialize_any! {
bool i8 i16 i32 i64 u8 u16 u32 u64 f32 f64 char str string bytes 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 byte_buf option unit unit_struct seq tuple tuple_struct identifier
tuple_struct identifier ignored_any ignored_any
} }
} }

View File

@ -64,7 +64,6 @@ enum Unsupported {
Optional, Optional,
Unit, Unit,
UnitStruct, UnitStruct,
NewtypeStruct,
Sequence, Sequence,
Tuple, Tuple,
TupleStruct, TupleStruct,
@ -83,7 +82,6 @@ impl Display for Unsupported {
Unsupported::Optional => formatter.write_str("an optional"), Unsupported::Optional => formatter.write_str("an optional"),
Unsupported::Unit => formatter.write_str("unit"), Unsupported::Unit => formatter.write_str("unit"),
Unsupported::UnitStruct => formatter.write_str("unit struct"), Unsupported::UnitStruct => formatter.write_str("unit struct"),
Unsupported::NewtypeStruct => formatter.write_str("newtype struct"),
Unsupported::Sequence => formatter.write_str("a sequence"), Unsupported::Sequence => formatter.write_str("a sequence"),
Unsupported::Tuple => formatter.write_str("a tuple"), Unsupported::Tuple => formatter.write_str("a tuple"),
Unsupported::TupleStruct => formatter.write_str("a tuple struct"), Unsupported::TupleStruct => formatter.write_str("a tuple struct"),
@ -1153,13 +1151,12 @@ impl<'a, M> Serializer for FlatMapSerializer<'a, M>
fn serialize_newtype_struct<T: ?Sized>( fn serialize_newtype_struct<T: ?Sized>(
self, self,
_: &'static str, _: &'static str,
_value: &T, value: &T,
) -> Result<Self::Ok, Self::Error> ) -> Result<Self::Ok, Self::Error>
where where
T: Serialize, T: Serialize,
{ {
// TODO: can we do better here? value.serialize(self)
Err(self.bad_type(Unsupported::NewtypeStruct))
} }
fn serialize_newtype_variant<T: ?Sized>( fn serialize_newtype_variant<T: ?Sized>(

View File

@ -127,9 +127,12 @@ enum FlattenStructEnum {
struct FlattenStructTagContentEnumWrapper { struct FlattenStructTagContentEnumWrapper {
outer: u32, outer: u32,
#[serde(flatten)] #[serde(flatten)]
data: FlattenStructTagContentEnum, data: FlattenStructTagContentEnumNewtype,
} }
#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct FlattenStructTagContentEnumNewtype(pub FlattenStructTagContentEnum);
#[derive(Debug, PartialEq, Serialize, Deserialize)] #[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "type", content = "value")] #[serde(rename_all = "snake_case", tag = "type", content = "value")]
enum FlattenStructTagContentEnum { enum FlattenStructTagContentEnum {
@ -1394,10 +1397,12 @@ fn test_flatten_struct_enum() {
fn test_flatten_struct_tag_content_enum() { fn test_flatten_struct_tag_content_enum() {
let change_request = FlattenStructTagContentEnumWrapper { let change_request = FlattenStructTagContentEnumWrapper {
outer: 42, outer: 42,
data: FlattenStructTagContentEnum::InsertInteger { data: FlattenStructTagContentEnumNewtype(
FlattenStructTagContentEnum::InsertInteger {
index: 0, index: 0,
value: 42 value: 42
}, }
),
}; };
assert_de_tokens( assert_de_tokens(
&change_request, &change_request,