figa 0.2.0

A layered configuration library for Rust
Documentation
use std::collections::BTreeMap;

#[derive(figa::Figa, serde_derive::Serialize, serde_derive::Deserialize)]
struct ConfigValue {
    foo: String,
    #[figa(append)]
    bar: String,
}

#[derive(figa::Figa, serde_derive::Serialize, serde_derive::Deserialize)]
struct DemoConfig {
    a: u32,
    b: String,
    c: Vec<u32>,
    #[figa(replace)]
    d: Vec<String>,
    #[figa(update)]
    e: BTreeMap<String, ConfigValue>,
    #[figa(append)]
    #[serde(skip_serializing_if = "Option::is_none", default)]
    f: Option<String>,
}

#[derive(figa::Figa, serde_derive::Deserialize)]
struct DemoConfig2(
    u32,
    String,
    Vec<u32>,
    #[figa(replace)] Vec<String>,
    #[figa(update)] BTreeMap<String, ConfigValue>,
);

fn main() {
    let cfg1 =
        r#"{"a":1,"b":"qwe","c":[1,2,3],"d":["asd","zxc"],"e":{"ccc":{"foo":"jkl","bar":"xcv"}}}"#;
    let cfg2_update = r#"{}"#;
    let cfg2 =
        r#"{"a":1,"b":"qwe","c":[1,2,3],"d":["asd","zxc"],"e":{"ccc":{"foo":"jkl","bar":"xcv"}}}"#;
    let cfg3_update = r#"{"a":2}"#;
    let cfg3 =
        r#"{"a":2,"b":"qwe","c":[1,2,3],"d":["asd","zxc"],"e":{"ccc":{"foo":"jkl","bar":"xcv"}}}"#;
    let cfg4_update = r#"{"b":"asd"}"#;
    let cfg4 =
        r#"{"a":2,"b":"asd","c":[1,2,3],"d":["asd","zxc"],"e":{"ccc":{"foo":"jkl","bar":"xcv"}}}"#;
    let cfg5_update = r#"{"c":[4,5,6]}"#;
    let cfg5 = r#"{"a":2,"b":"asd","c":[1,2,3,4,5,6],"d":["asd","zxc"],"e":{"ccc":{"foo":"jkl","bar":"xcv"}}}"#;
    let cfg6_update = r#"{"d":["qwe","bbb","uio"]}"#;
    let cfg6 = r#"{"a":2,"b":"asd","c":[1,2,3,4,5,6],"d":["qwe","bbb","uio"],"e":{"ccc":{"foo":"jkl","bar":"xcv"}}}"#;
    let cfg7_update = r#"{"e":{"aaa":{"foo":"pop","bar":"nop"}}}"#;
    let cfg7 = r#"{"a":2,"b":"asd","c":[1,2,3,4,5,6],"d":["qwe","bbb","uio"],"e":{"aaa":{"foo":"pop","bar":"nop"},"ccc":{"foo":"jkl","bar":"xcv"}}}"#;
    let cfg8_update = r#"{"e":{"ccc":{"foo":"ghj"}}}"#;
    let cfg8 = r#"{"a":2,"b":"asd","c":[1,2,3,4,5,6],"d":["qwe","bbb","uio"],"e":{"aaa":{"foo":"pop","bar":"nop"},"ccc":{"foo":"ghj","bar":"xcv"}}}"#;
    let cfg9_update = r#"{"e":{"ccc":{"bar":"zxc"}}}"#;
    let cfg9 = r#"{"a":2,"b":"asd","c":[1,2,3,4,5,6],"d":["qwe","bbb","uio"],"e":{"aaa":{"foo":"pop","bar":"nop"},"ccc":{"foo":"ghj","bar":"xcvzxc"}}}"#;
    let cfg10_update = r#"{"f":"qwe"}"#;
    let cfg10 = r#"{"a":2,"b":"asd","c":[1,2,3,4,5,6],"d":["qwe","bbb","uio"],"e":{"aaa":{"foo":"pop","bar":"nop"},"ccc":{"foo":"ghj","bar":"xcvzxc"}},"f":"qwe"}"#;
    std::env::set_var("FIGA_DEMO_D", "y , z, \"q\\x20\"");
    let cfg11 = r#"{"a":2,"b":"asd","c":[1,2,3,4,5,6],"d":["y","z","q "],"e":{"aaa":{"foo":"pop","bar":"nop"},"ccc":{"foo":"ghj","bar":"xcvzxc"}},"f":"qwe"}"#;

    let mut cfg: DemoConfig = serde_json::from_str(cfg1).unwrap();

    figa::Figa::update(
        &mut cfg,
        &mut serde_json::Deserializer::from_str(cfg2_update),
    )
    .unwrap();
    assert_eq!(serde_json::to_string(&cfg).unwrap(), cfg2);

    figa::Figa::update(
        &mut cfg,
        &mut serde_json::Deserializer::from_str(cfg3_update),
    )
    .unwrap();
    assert_eq!(serde_json::to_string(&cfg).unwrap(), cfg3);

    figa::Figa::update(
        &mut cfg,
        &mut serde_json::Deserializer::from_str(cfg4_update),
    )
    .unwrap();
    assert_eq!(serde_json::to_string(&cfg).unwrap(), cfg4);

    figa::Figa::update(
        &mut cfg,
        &mut serde_json::Deserializer::from_str(cfg5_update),
    )
    .unwrap();
    assert_eq!(serde_json::to_string(&cfg).unwrap(), cfg5);

    figa::Figa::update(
        &mut cfg,
        &mut serde_json::Deserializer::from_str(cfg6_update),
    )
    .unwrap();
    assert_eq!(serde_json::to_string(&cfg).unwrap(), cfg6);

    figa::Figa::update(
        &mut cfg,
        &mut serde_json::Deserializer::from_str(cfg7_update),
    )
    .unwrap();
    assert_eq!(serde_json::to_string(&cfg).unwrap(), cfg7);

    figa::Figa::update(
        &mut cfg,
        &mut serde_json::Deserializer::from_str(cfg8_update),
    )
    .unwrap();
    assert_eq!(serde_json::to_string(&cfg).unwrap(), cfg8);

    figa::Figa::update(
        &mut cfg,
        &mut serde_json::Deserializer::from_str(cfg9_update),
    )
    .unwrap();
    assert_eq!(serde_json::to_string(&cfg).unwrap(), cfg9);

    figa::Figa::update(
        &mut cfg,
        &mut serde_json::Deserializer::from_str(cfg10_update),
    )
    .unwrap();
    assert_eq!(serde_json::to_string(&cfg).unwrap(), cfg10);

    figa::Figa::update(
        &mut cfg,
        denvars::Deserializer::from_prefixed_env_vars("FIGA_DEMO_"),
    )
    .unwrap();
    assert_eq!(serde_json::to_string(&cfg).unwrap(), cfg11);
}