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)))
}
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! {
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
}
}

View File

@ -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<T: ?Sized>(
self,
_: &'static str,
_value: &T,
value: &T,
) -> Result<Self::Ok, Self::Error>
where
T: Serialize,
{
// TODO: can we do better here?
Err(self.bad_type(Unsupported::NewtypeStruct))
value.serialize(self)
}
fn serialize_newtype_variant<T: ?Sized>(

View File

@ -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 {
data: FlattenStructTagContentEnumNewtype(
FlattenStructTagContentEnum::InsertInteger {
index: 0,
value: 42
},
}
),
};
assert_de_tokens(
&change_request,