I've poked the serde-yaml and yaml-rust crates a bit, but I haven't seen any examples.
How do you read a YAML file in Rust?
Asked Answered
serde-yaml's documentation has the following 4 functions:
from_reader
— Deserialize an instance of typeT
from an IO stream of YAML.from_slice
— Deserialize an instance of typeT
from bytes of YAML text.from_str
— Deserialize an instance of typeT
from a string of YAML text.from_value
— Interpret aserde_yaml::Value
as an instance of typeT
.
Using from_reader
as an example:
use serde_yaml; // 0.8.7
fn main() -> Result<(), Box<dyn 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:
In general, using any Serde format is pretty much the same as all the rest.
@Marcionism sounds like your YAML file is malformed or doesn't match with the type that you are attempting to parse. –
Amanuensis
humm sorry (rust beginner here); i was more trying to parse key/value'd yaml file (a one liner like
a: 'b'
) to get started). but i guess it goes well beyond the scope of the initial issue here –
Marcionism @Marcionism that's what "You can deserialize into the looser-typed Value if you don't know your format " and "read the Serde guide for full details of how to do type-directed" refer to. –
Amanuensis
For anyone reading this later on, the serde-yaml repository has been archived but there is an active fork that can be found here: github.com/sebastienrousseau/serde_yml –
Sirdar
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] ..
}
Also consider
std::fs::read_to_string
to read the file contents. –
Underpart 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"))
}
© 2022 - 2024 — McMap. All rights reserved.
Error: Scan(ScanError { mark: Marker { index: 7, line: 2, col: 4 }, info: "mapping values are not allowed in this context" })
; does anything changed since your answer @Amanuensis ? – Marcionism