shapely_yaml/
lib.rs

1#![doc = include_str!("../README.md")]
2
3use shapely_core::{Partial};
4use yaml_rust2::YamlLoader;
5
6pub fn from_yaml<'input>(partial: &mut Partial, yaml: &'input str) -> Result<(), String> {
7    let docs = YamlLoader::load_from_str(yaml).map_err(|e| e.to_string())?;
8
9    // Assuming only one document in the YAML string
10    let doc = &docs[0];
11    match doc {
12        yaml_rust2::Yaml::Hash(hash) => {
13            for (key, value) in hash {
14                let key_str = match key.as_str() {
15                    Some(s) => s,
16                    None => return Err("Expected string key".to_string()),
17                };
18
19                let slot = partial
20                    .slot_by_name(key_str)
21                    .map_err(|_| format!("Unknown field: {}", key_str))?;
22
23                match value {
24                    yaml_rust2::Yaml::String(s) => {
25                        slot.fill(s.clone());
26                    }
27                    yaml_rust2::Yaml::Integer(i) => {
28                        slot.fill(*i as u64);
29                    }
30                    _ => {
31                        println!("Unsupported YAML type for field: {}", key_str);
32                        unimplemented!()
33                    }
34                }
35            }
36        }
37        _ => {
38            return Err("Expected a YAML hash".to_string());
39        }
40    }
41
42    Ok(())
43}
44
45#[cfg(test)]
46mod tests {
47    #[test]
48    fn it_works() {
49        assert_eq!(2 + 2, 4);
50    }
51}