我有一个结构,其中包含一个我想使用Serde从YAML反序列化的枚举:
use serde::Deserialize;
#[derive(Deserialize, Debug, PartialEq)]
struct Foo {
common: String,
#[serde(flatten)]
bar: Bar,
}
#[derive(Deserialize, Debug, PartialEq)]
#[serde(rename_all = "snake_case")]
enum Bar {
BarA(BarA),
BarB(BarB),
}
#[derive(Deserialize, Debug, PartialEq)]
struct BarA {
a: String,
}
#[derive(Deserialize, Debug, PartialEq)]
struct BarB {
b: String,
}
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_yaml = "0.8"
代码可以编译,但是要使其正确反序列化,YAML必须看起来像这样:
common: Hello
bar_a:
a: World
问题是我的YAML看起来像这样:
bar_a:
common: Hello
a: World
请注意,枚举标记位于结构之外的最外层。如何从该格式反序列化?我的枚举相当长(超过20个变体),所以我宁愿避免任何需要更多样板代码的事情。
要清楚,我正在寻找可以通过以下测试的东西:
#[cfg(test)]
#[test]
fn test() {
let input = r#"
bar_a:
common: Hello
a: World
"#;
let foo: Foo = serde_yaml::from_str(&input).unwrap();
assert_eq!(
foo,
Foo {
common: "Hello".to_string(),
bar: Bar::BarA(BarA {
a: "World".to_string()
})
}
);
}
Here在Rust操场上。