From cda1fc46b0cac630a9050b6cf4ede98ad8f4760a Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 14 May 2017 12:21:00 -0700 Subject: [PATCH] Fix internally tagged struct variant containing unit variant containing borrowed string --- serde/src/private/de.rs | 4 ++-- test_suite/tests/test_macros.rs | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/serde/src/private/de.rs b/serde/src/private/de.rs index 2c5648cd..19736a14 100644 --- a/serde/src/private/de.rs +++ b/serde/src/private/de.rs @@ -1082,7 +1082,7 @@ mod content { } (variant, Some(value)) } - Content::String(variant) => (Content::String(variant), None), + s @ Content::String(_) | s @ Content::Str(_) => (s, None), other => { return Err(de::Error::invalid_type(other.unexpected(), &"string or map"),); } @@ -1476,7 +1476,7 @@ mod content { } (variant, Some(value)) } - ref s @ Content::String(_) => (s, None), + ref s @ Content::String(_) | ref s @ Content::Str(_) => (s, None), ref other => { return Err(de::Error::invalid_type(other.unexpected(), &"string or map"),); } diff --git a/test_suite/tests/test_macros.rs b/test_suite/tests/test_macros.rs index 651bcfea..c4c61566 100644 --- a/test_suite/tests/test_macros.rs +++ b/test_suite/tests/test_macros.rs @@ -695,6 +695,35 @@ fn test_internally_tagged_enum() { ); } +#[test] +fn test_internally_tagged_struct_variant_containing_unit_variant() { + #[derive(Debug, PartialEq, Serialize, Deserialize)] + pub enum Level { + Info, + } + + #[derive(Debug, PartialEq, Serialize, Deserialize)] + #[serde(tag = "action")] + pub enum Message { + Log { level: Level }, + } + + assert_de_tokens( + &Message::Log { level: Level::Info }, + &[ + Token::Struct { name: "Message", len: 2 }, + + Token::Str("action"), + Token::Str("Log"), + + Token::Str("level"), + Token::BorrowedStr("Info"), + + Token::StructEnd, + ], + ); +} + #[test] fn test_internally_tagged_borrow() { #[derive(Debug, PartialEq, Serialize, Deserialize)]