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}