当成员枚举标签位于最外层时,使用serde反序列化struct?

时间:2019-08-04 18:31:43

标签: enums rust yaml deserialization serde

我有一个结构,其中包含一个我想使用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操场上。

0 个答案:

没有答案