From 27f935f036f3c8bc97775574c7182ce8458ee2b5 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Tue, 20 Mar 2018 23:05:05 +0100 Subject: [PATCH] Correctly serialize newtype variants for flatten --- serde/src/private/ser.rs | 5 ++-- test_suite/tests/test_annotations.rs | 34 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/serde/src/private/ser.rs b/serde/src/private/ser.rs index 98dda162..8af1283a 100644 --- a/serde/src/private/ser.rs +++ b/serde/src/private/ser.rs @@ -1161,13 +1161,14 @@ impl<'a, M> Serializer for FlatMapSerializer<'a, M> self, _: &'static str, _: u32, - _: &'static str, + variant: &'static str, value: &T, ) -> Result where T: Serialize, { - value.serialize(self) + try!(self.0.serialize_key(variant)); + self.0.serialize_value(value) } fn serialize_seq(self, _: Option) -> Result { diff --git a/test_suite/tests/test_annotations.rs b/test_suite/tests/test_annotations.rs index 9eccf697..6ce2c3ef 100644 --- a/test_suite/tests/test_annotations.rs +++ b/test_suite/tests/test_annotations.rs @@ -1763,3 +1763,37 @@ fn test_lifetime_propagation_for_flatten() { ], ); } + +#[test] +fn test_flatten_enum_newtype() { + #[derive(Serialize, Deserialize, PartialEq, Debug)] + struct S { + #[serde(flatten)] + flat: E, + } + + #[derive(Serialize, Deserialize, PartialEq, Debug)] + enum E { + Q(HashMap), + } + + let e = E::Q({ + let mut map = HashMap::new(); + map.insert("k".to_owned(), "v".to_owned()); + map + }); + let s = S { flat: e }; + + assert_tokens( + &s, + &[ + Token::Map { len: None }, + Token::Str("Q"), + Token::Map { len: Some(1) }, + Token::Str("k"), + Token::Str("v"), + Token::MapEnd, + Token::MapEnd, + ], + ); +}