如何在Rust中读取YAML文件?

时间:2018-11-10 21:56:16

标签: rust yaml

我已经戳了serde-yamlyaml-rust板条箱,但是我没有看到任何示例。

4 个答案:

答案 0 :(得分:6)

serde-yaml's documentation具有以下4个功能:

  • from_reader —从YAML的IO流中反序列化类型为T的实例。
  • from_slice —从YAML文本字节中反序列化类型T的实例。
  • from_str —从YAML文本字符串中反序列化类型T的实例。
  • from_value —将serde_yaml::Value解释为类型T的实例。

from_reader为例:

extern crate serde_yaml;

fn main() -> Result<(), Box<std::error::Error>> {
    let f = std::fs::File::open("something.yaml")?;
    let d: String = serde_yaml::from_reader(f)?;
    println!("Read YAML string: {}", d);
    Ok(())
}

如果您不知道其格式,则可以将其反序列化为宽松类型的Value,但是请务必阅读Serde guide,以获取有关如何进行类型定向的序列化和反序列化的完整详细信息。

另请参阅:

通常,使用 any Serde格式与其余所有格式几乎相同。

答案 1 :(得分:0)

YAML文件是普通的(文本)文件,就像您可以使用其阅读的任何其他文件一样 Rust documentation中的示例。特别是使用File::open(filename)并对前者的结果进行.read_to_string()

yaml-rustserde-yaml用于解析加载 YAML文件,并且由于您的问题并不表示您想要这样做,但只想阅读该文件,则无需使用这些库。

答案 2 :(得分:0)

此示例使用yaml_rust crate

use std::fs::File;
use std::io::prelude::*;
use yaml_rust::yaml::{Hash, Yaml};
use yaml_rust::YamlLoader;

fn main() {
    println!("Hello, Yaml");
    let file = "./etc/my_yaml_file.yaml";
    load_file(file);
}

fn load_file(file: &str) {
    let mut file = File::open(file).expect("Unable to open file");
    let mut contents = String::new();

    file.read_to_string(&mut contents)
        .expect("Unable to read file");

    let docs = YamlLoader::load_from_str(&contents).unwrap();

    // iterate / process doc[s] ..
}

答案 3 :(得分:-1)

如果您想正确地做,上面的答案很好。这是一个入门的完整示例。

data['foo']['bar'].as_str()返回一个Option<str>

fn example() -> Result<String> {
    let f = std::fs::File::open("something.yaml")?;
    let data: serde_yaml::Value = serde_yaml::from_reader(f)?;
    data["foo"]["bar"]
        .as_str()
        .map(|s| s.to_string())
        .ok_or(anyhow!("Could not find key foo.bar in something.yaml"))
}