yaml_extras 0.2.0

Misc yaml-related utility functions
Documentation
use serde_derive::Serialize;
use std::default::Default;

#[derive(Serialize, Default)]
struct UserId {
    first_name: String,
    last_name: String,
    public_id: String,
    internal_id: u32,
}

#[derive(Serialize)]
struct Preferences {
    screen_size: [u32; 2],
    allow_cookies: bool,
    two_fa: bool
}

impl Default for Preferences {
    fn default() -> Self {
        Preferences {
            screen_size: [1024, 768],
            allow_cookies: false,
            two_fa: true
        }
    }
}

#[derive(Serialize, Default)]
struct User {
    id: UserId,
    preferences: Preferences,
}


fn main() {
    use yaml_extras::document::ValueType;


    let desc_yaml = r#"
id:
    __description__: Info about the users
    public_id: Must oncly contain aphanumeric characters
    internal_id: Must never be changed
preferences:
    __description__: Various user settings
    screen_size: Width and height, in pixels, obviously
"#;

    let value = serde_yaml::to_value(&User::default()).unwrap();
    let desc: serde_yaml::Value = serde_yaml::from_str(&desc_yaml).unwrap();
    let d2 = yaml_extras::Documenter::new();
    let d = yaml_extras::Documenter::new()
        .format_key(&|k| {
            format!("{}{}:{}\n", k.indent, k.key, k.value)
        })
        .type_name(&|t| match t {
            ValueType::Mapping | ValueType::Tagged => format!(""),
            _ => ValueType::to_str(t)
        });
    let s = d2.apply_value(&value, Some(&desc)).unwrap();

    println!("{s}");
}