mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-11 22:01:04 +00:00
Unpack a layer of NewtypeStruct when content is newtype
This commit is contained in:
+12
-2
@@ -1310,7 +1310,12 @@ mod content {
|
|||||||
where
|
where
|
||||||
V: Visitor<'de>,
|
V: Visitor<'de>,
|
||||||
{
|
{
|
||||||
visitor.visit_newtype_struct(self)
|
match self.content {
|
||||||
|
Content::Newtype(v) => {
|
||||||
|
visitor.visit_newtype_struct(ContentDeserializer::new(*v))
|
||||||
|
}
|
||||||
|
_ => visitor.visit_newtype_struct(self),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
@@ -2001,7 +2006,12 @@ mod content {
|
|||||||
where
|
where
|
||||||
V: Visitor<'de>,
|
V: Visitor<'de>,
|
||||||
{
|
{
|
||||||
visitor.visit_newtype_struct(self)
|
match *self.content {
|
||||||
|
Content::Newtype(ref v) => {
|
||||||
|
visitor.visit_newtype_struct(ContentRefDeserializer::new(v))
|
||||||
|
}
|
||||||
|
_ => visitor.visit_newtype_struct(self),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
fn deserialize_seq<V>(self, visitor: V) -> Result<V::Value, Self::Error>
|
||||||
|
|||||||
@@ -446,6 +446,54 @@ fn test_generic_newtype_struct() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_untagged_newtype_struct() {
|
||||||
|
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(untagged)]
|
||||||
|
enum E {
|
||||||
|
Newtype(GenericNewTypeStruct<u32>),
|
||||||
|
Null,
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_tokens(
|
||||||
|
&E::Newtype(GenericNewTypeStruct(5u32)),
|
||||||
|
&[
|
||||||
|
Token::NewtypeStruct {
|
||||||
|
name: "GenericNewTypeStruct",
|
||||||
|
},
|
||||||
|
Token::U32(5),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_adjacently_tagged_newtype_struct() {
|
||||||
|
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(tag = "t", content = "c")]
|
||||||
|
enum E {
|
||||||
|
Newtype(GenericNewTypeStruct<u32>),
|
||||||
|
Null,
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_de_tokens(
|
||||||
|
&E::Newtype(GenericNewTypeStruct(5u32)),
|
||||||
|
&[
|
||||||
|
Token::Struct {
|
||||||
|
name: "E",
|
||||||
|
len: 2,
|
||||||
|
},
|
||||||
|
Token::Str("c"),
|
||||||
|
Token::NewtypeStruct {
|
||||||
|
name: "GenericNewTypeStruct",
|
||||||
|
},
|
||||||
|
Token::U32(5),
|
||||||
|
Token::Str("t"),
|
||||||
|
Token::Str("Newtype"),
|
||||||
|
Token::StructEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_generic_tuple_struct() {
|
fn test_generic_tuple_struct() {
|
||||||
assert_tokens(
|
assert_tokens(
|
||||||
|
|||||||
Reference in New Issue
Block a user