shapely_yaml/
lib.rs

1#![warn(missing_docs)]
2#![doc = include_str!("../README.md")]
3
4use shapely_core::Partial;
5use yaml_rust2::YamlLoader;
6
7/// Deserializes YAML data into a Shapely Partial.
8///
9/// # Example
10///
11/// ```
12/// use shapely::Shapely;
13/// use shapely_yaml::from_yaml;
14///
15/// #[derive(Debug, Shapely, PartialEq)]
16/// struct Config {
17///     name: String,
18///     version: u64,
19/// }
20///
21/// let yaml = r#"
22/// name: MyApp
23/// version: 1
24/// "#;
25///
26/// let mut partial = Config::partial();
27/// from_yaml(&mut partial, yaml).expect("Failed to parse YAML");
28///
29/// let config = partial.build::<Config>();
30/// assert_eq!(config, Config { name: "MyApp".to_string(), version: 1 });
31/// ```
32pub fn from_yaml(partial: &mut Partial, yaml: &str) -> Result<(), String> {
33    let docs = YamlLoader::load_from_str(yaml).map_err(|e| e.to_string())?;
34
35    // Assuming only one document in the YAML string
36    let doc = &docs[0];
37    match doc {
38        yaml_rust2::Yaml::Hash(hash) => {
39            for (key, value) in hash {
40                let key_str = match key.as_str() {
41                    Some(s) => s,
42                    None => return Err("Expected string key".to_string()),
43                };
44
45                let slot = partial
46                    .slot_by_name(key_str)
47                    .map_err(|_| format!("Unknown field: {}", key_str))?;
48
49                match value {
50                    yaml_rust2::Yaml::String(s) => {
51                        slot.fill(s.clone());
52                    }
53                    yaml_rust2::Yaml::Integer(i) => {
54                        slot.fill(*i as u64);
55                    }
56                    _ => {
57                        println!("Unsupported YAML type for field: {}", key_str);
58                        unimplemented!()
59                    }
60                }
61            }
62        }
63        _ => {
64            return Err("Expected a YAML hash".to_string());
65        }
66    }
67
68    Ok(())
69}
70
71#[cfg(test)]
72mod tests {
73    #[test]
74    fn it_works() {
75        assert_eq!(2 + 2, 4);
76    }
77}