diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index 883e6909..c402d2c6 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -313,6 +313,8 @@ mod content { } } + /// Used to capture data in [`Content`] from other deserializers. + /// Cannot capture externally tagged enums, `i128` and `u128`. struct ContentVisitor<'de> { value: PhantomData>, } @@ -528,6 +530,8 @@ mod content { Content(Content<'de>), } + /// Serves as a seed for deserializing a key of internally tagged enum. + /// Cannot capture externally tagged enums, `i128` and `u128`. struct TagOrContentVisitor<'de> { name: &'static str, value: PhantomData>, @@ -814,6 +818,9 @@ mod content { /// Used by generated code to deserialize an internally tagged enum. /// + /// Captures map or sequence from the original deserializer and searches + /// a tag in it (in case of sequence, tag is the first element of sequence). + /// /// Not public API. pub struct TaggedContentVisitor { tag_name: &'static str, diff --git a/test_suite/tests/test_macros.rs b/test_suite/tests/test_macros.rs index 02c36c41..0d6472df 100644 --- a/test_suite/tests/test_macros.rs +++ b/test_suite/tests/test_macros.rs @@ -1081,6 +1081,15 @@ fn test_internally_tagged_struct_variant_containing_unit_variant() { Log { level: Level }, } + assert_de_tokens( + &Level::Info, + &[ + Token::Enum { name: "Level" }, + Token::BorrowedStr("Info"), + Token::Unit, + ], + ); + assert_de_tokens( &Message::Log { level: Level::Info }, &[ @@ -1091,7 +1100,9 @@ fn test_internally_tagged_struct_variant_containing_unit_variant() { Token::Str("action"), Token::Str("Log"), Token::Str("level"), + Token::Enum { name: "Level" }, Token::BorrowedStr("Info"), + Token::Unit, Token::StructEnd, ], ); @@ -1103,7 +1114,9 @@ fn test_internally_tagged_struct_variant_containing_unit_variant() { Token::Str("action"), Token::Str("Log"), Token::Str("level"), + Token::Enum { name: "Level" }, Token::BorrowedStr("Info"), + Token::Unit, Token::MapEnd, ], ); @@ -1113,7 +1126,9 @@ fn test_internally_tagged_struct_variant_containing_unit_variant() { &[ Token::Seq { len: Some(2) }, Token::Str("Log"), + Token::Enum { name: "Level" }, Token::BorrowedStr("Info"), + Token::Unit, Token::SeqEnd, ], );