Added newtype struct support for flattening
This commit is contained in:
parent
ffcde25b6e
commit
ebc61baab2
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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>(
|
||||||
|
@ -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,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user