Rust 如何使用Serde解析具有多种不同类型的YAML文件?

Rust 如何使用Serde解析具有多种不同类型的YAML文件?,rust,yaml,serde,Rust,Yaml,Serde,我正在尝试解析这个YAML文件 application: build: something container_name: another_thing environment: - ONE_ENV=fake - SEC_ENV=something 我已经创建了这段代码,它可以完美地工作: #[macro_use] extern crate serde_derive; extern crate serde_yaml; use std::fs::File; use s

我正在尝试解析这个YAML文件

application:
  build: something
  container_name: another_thing
  environment:
    - ONE_ENV=fake
    - SEC_ENV=something
我已经创建了这段代码,它可以完美地工作:

#[macro_use]
extern crate serde_derive;
extern crate serde_yaml;

use std::fs::File;
use std::io::Read;

#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Application {
    application: Data,
}

#[derive(Debug, PartialEq, Serialize, Deserialize)]
struct Data {
    build: String,
    container_name: String,

    #[serde(skip_serializing_if = "Option::is_none")]
    environment: Option<Vec<String>>,
}

fn main() {
    let filename = "example.yml";
    match File::open(filename) {
        Ok(mut file) => {
            let mut content = String::new();
            file.read_to_string(&mut content).unwrap();

            let application_data: Application = serde_yaml::from_str(&content).unwrap();
            println!("{:?}", application_data.application.environment);
        }
        Err(error) => {
            println!("There is an error {}: {}", filename, error);
        }
    }
}

我如何处理两种不同的解析方法?

你有吗?。TL;DR:创建一个:
#[serde(untaged)]枚举环境{Vec(Vec),Hash(BTreeMap)}
并将其用于您的
环境
。谢谢@Shepmaster第二个对我帮助很大,文档说明了我是如何开始的,但枚举方法要好得多。谢谢
application:
  build: something
  container_name: another_thing
  environment:
    ONE_ENV: fake
    SEC_ENV: something