mirror of
https://github.com/pezkuwichain/serde.git
synced 2026-06-14 09:21:01 +00:00
Merge pull request #2646 from robsdedude/fix/2643/allow-tag-field-in-untagged
Allow internal tag field in untagged variant
This commit is contained in:
@@ -318,6 +318,9 @@ fn check_internal_tag_field_name_conflict(cx: &Ctxt, cont: &Container) {
|
|||||||
for variant in variants {
|
for variant in variants {
|
||||||
match variant.style {
|
match variant.style {
|
||||||
Style::Struct => {
|
Style::Struct => {
|
||||||
|
if variant.attrs.untagged() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
for field in &variant.fields {
|
for field in &variant.fields {
|
||||||
let check_ser =
|
let check_ser =
|
||||||
!(field.attrs.skip_serializing() || variant.attrs.skip_serializing());
|
!(field.attrs.skip_serializing() || variant.attrs.skip_serializing());
|
||||||
|
|||||||
@@ -814,6 +814,100 @@ fn test_internally_tagged_enum() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_internally_tagged_enum_with_untagged_variant() {
|
||||||
|
#[derive(Debug, PartialEq, Serialize, Deserialize)]
|
||||||
|
#[serde(tag = "kind")]
|
||||||
|
enum InternallyTagged {
|
||||||
|
Tagged {
|
||||||
|
a: u8,
|
||||||
|
},
|
||||||
|
#[serde(untagged)]
|
||||||
|
Untagged {
|
||||||
|
kind: String,
|
||||||
|
b: u8,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_de_tokens(
|
||||||
|
&InternallyTagged::Tagged { a: 1 },
|
||||||
|
&[
|
||||||
|
Token::Map { len: Some(2) },
|
||||||
|
Token::Str("kind"),
|
||||||
|
Token::Str("Tagged"),
|
||||||
|
Token::Str("a"),
|
||||||
|
Token::U8(1),
|
||||||
|
Token::MapEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_tokens(
|
||||||
|
&InternallyTagged::Tagged { a: 1 },
|
||||||
|
&[
|
||||||
|
Token::Struct {
|
||||||
|
name: "InternallyTagged",
|
||||||
|
len: 2,
|
||||||
|
},
|
||||||
|
Token::Str("kind"),
|
||||||
|
Token::Str("Tagged"),
|
||||||
|
Token::Str("a"),
|
||||||
|
Token::U8(1),
|
||||||
|
Token::StructEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_de_tokens(
|
||||||
|
&InternallyTagged::Untagged {
|
||||||
|
kind: "Foo".to_owned(),
|
||||||
|
b: 2,
|
||||||
|
},
|
||||||
|
&[
|
||||||
|
Token::Map { len: Some(2) },
|
||||||
|
Token::Str("kind"),
|
||||||
|
Token::Str("Foo"),
|
||||||
|
Token::Str("b"),
|
||||||
|
Token::U8(2),
|
||||||
|
Token::MapEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_tokens(
|
||||||
|
&InternallyTagged::Untagged {
|
||||||
|
kind: "Foo".to_owned(),
|
||||||
|
b: 2,
|
||||||
|
},
|
||||||
|
&[
|
||||||
|
Token::Struct {
|
||||||
|
name: "InternallyTagged",
|
||||||
|
len: 2,
|
||||||
|
},
|
||||||
|
Token::Str("kind"),
|
||||||
|
Token::Str("Foo"),
|
||||||
|
Token::Str("b"),
|
||||||
|
Token::U8(2),
|
||||||
|
Token::StructEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
|
assert_tokens(
|
||||||
|
&InternallyTagged::Untagged {
|
||||||
|
kind: "Tagged".to_owned(),
|
||||||
|
b: 2,
|
||||||
|
},
|
||||||
|
&[
|
||||||
|
Token::Struct {
|
||||||
|
name: "InternallyTagged",
|
||||||
|
len: 2,
|
||||||
|
},
|
||||||
|
Token::Str("kind"),
|
||||||
|
Token::Str("Tagged"),
|
||||||
|
Token::Str("b"),
|
||||||
|
Token::U8(2),
|
||||||
|
Token::StructEnd,
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_internally_tagged_bytes() {
|
fn test_internally_tagged_bytes() {
|
||||||
#[derive(Debug, PartialEq, Deserialize)]
|
#[derive(Debug, PartialEq, Deserialize)]
|
||||||
|
|||||||
Reference in New Issue
Block a user