Added support for struct variant enum serialization

This commit is contained in:
Armin Ronacher
2018-03-16 22:40:08 +01:00
parent d1833c5602
commit a8c8c2028e
2 changed files with 128 additions and 15 deletions
+67 -1
View File
@@ -96,7 +96,7 @@ where
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(repr="map")]
#[serde(repr = "map")]
struct CollectOther {
a: u32,
b: u32,
@@ -104,6 +104,27 @@ struct CollectOther {
extra: HashMap<String, u32>,
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(repr = "map")]
struct ChangeRequest {
#[serde(flatten)]
data: ChangeAction,
#[serde(flatten)]
extra: HashMap<String, String>,
}
#[derive(Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
enum ChangeAction {
AppendInteger {
value: u32
},
InsertInteger {
index: u32,
value: u32
},
}
#[test]
fn test_default_struct() {
assert_de_tokens(
@@ -1309,3 +1330,48 @@ fn test_collect_other() {
],
);
}
#[test]
fn test_flatten_struct_enum() {
let mut extra = HashMap::new();
extra.insert("extra_key".into(), "extra value".into());
let change_request = ChangeRequest {
data: ChangeAction::InsertInteger {
index: 0,
value: 42
},
extra: extra,
};
assert_de_tokens(
&change_request,
&[
Token::Map { len: None },
Token::Str("insert_integer"),
Token::Map { len: None },
Token::Str("index"),
Token::U32(0),
Token::Str("value"),
Token::U32(42),
Token::MapEnd,
Token::Str("extra_key"),
Token::String("extra value".into()),
Token::MapEnd
],
);
assert_ser_tokens(
&change_request,
&[
Token::Map { len: None },
Token::Str("insert_integer"),
Token::Struct { len: 2, name: "insert_integer" },
Token::Str("index"),
Token::U32(0),
Token::Str("value"),
Token::U32(42),
Token::StructEnd,
Token::Str("extra_key"),
Token::String("extra value".into()),
Token::MapEnd
],
);
}