Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do you read a YAML file in Rust?

I've poked the serde-yaml and yaml-rust crates a bit, but I haven't seen any examples.

like image 642
semore_1267 Avatar asked Nov 10 '18 21:11

semore_1267


3 Answers

serde-yaml's documentation has the following 4 functions:

  • from_reader — Deserialize an instance of type T from an IO stream of YAML.
  • from_slice — Deserialize an instance of type T from bytes of YAML text.
  • from_str — Deserialize an instance of type T from a string of YAML text.
  • from_value — Interpret a serde_yaml::Value as an instance of type T.

Using from_reader as an example:

use serde_yaml; // 0.8.7

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(())
}

something.yaml:

"I am YAML"

You can deserialize into the looser-typed Value if you don't know your format (String in this example), but be sure to read the Serde guide for full details of how to do type-directed serialization and deserialization instead.

See also:

  • How do I parse a JSON File?
  • Deserializing TOML into vector of enum with values

In general, using any Serde format is pretty much the same as all the rest.

like image 128
Shepmaster Avatar answered Oct 18 '22 08:10

Shepmaster


This example uses the 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] ..
}
like image 41
sbeskur Avatar answered Oct 18 '22 07:10

sbeskur


The answer from Shepmaster is great if you want to do it properly. Here's a complete example to get started with.

data['foo']['bar'].as_str() returns an 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"))
}
like image 29
Unapiedra Avatar answered Oct 18 '22 07:10

Unapiedra