Skip to content

Commit b5d68ae

Browse files
authored
Merge pull request #2377 from mfro/master
Allow bytes for adjacently tagged enums
2 parents 624879c + a803ec1 commit b5d68ae

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

serde/src/private/de.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,19 @@ mod content {
990990
Ok(TagContentOtherField::Other)
991991
}
992992
}
993+
994+
fn visit_bytes<E>(self, field: &[u8]) -> Result<Self::Value, E>
995+
where
996+
E: de::Error,
997+
{
998+
if field == self.tag.as_bytes() {
999+
Ok(TagContentOtherField::Tag)
1000+
} else if field == self.content.as_bytes() {
1001+
Ok(TagContentOtherField::Content)
1002+
} else {
1003+
Ok(TagContentOtherField::Other)
1004+
}
1005+
}
9931006
}
9941007

9951008
/// Not public API

test_suite/tests/test_annotations.rs

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2317,6 +2317,59 @@ fn test_internally_tagged_enum_new_type_with_unit() {
23172317
);
23182318
}
23192319

2320+
#[test]
2321+
fn test_adjacently_tagged_enum_bytes() {
2322+
#[derive(Serialize, Deserialize, PartialEq, Debug)]
2323+
#[serde(tag = "t", content = "c")]
2324+
enum Data {
2325+
A { a: i32 },
2326+
}
2327+
2328+
let data = Data::A { a: 0 };
2329+
2330+
assert_tokens(
2331+
&data,
2332+
&[
2333+
Token::Struct {
2334+
name: "Data",
2335+
len: 2,
2336+
},
2337+
Token::Str("t"),
2338+
Token::Str("A"),
2339+
Token::Str("c"),
2340+
Token::Struct {
2341+
name: "A",
2342+
len: 1,
2343+
},
2344+
Token::Str("a"),
2345+
Token::I32(0),
2346+
Token::StructEnd,
2347+
Token::StructEnd,
2348+
],
2349+
);
2350+
2351+
assert_de_tokens(
2352+
&data,
2353+
&[
2354+
Token::Struct {
2355+
name: "Data",
2356+
len: 2,
2357+
},
2358+
Token::Bytes(b"t"),
2359+
Token::Str("A"),
2360+
Token::Bytes(b"c"),
2361+
Token::Struct {
2362+
name: "A",
2363+
len: 1,
2364+
},
2365+
Token::Str("a"),
2366+
Token::I32(0),
2367+
Token::StructEnd,
2368+
Token::StructEnd,
2369+
],
2370+
);
2371+
}
2372+
23202373
#[test]
23212374
fn test_adjacently_tagged_enum_containing_flatten() {
23222375
#[derive(Serialize, Deserialize, PartialEq, Debug)]

0 commit comments

Comments
 (0)