confique 0.4.0

Type-safe, layered, light-weight, `serde`-based configuration library
Documentation
use confique::Config;
use pretty_assertions::assert_eq;

#[test]
fn layer_props() {
    #[allow(dead_code)]
    #[derive(Config)]
    #[config(
        layer_attr(derive(derive_more::Debug, derive_more::Display)),
        layer_attr(display("{}", self.bar.unwrap_or_default())),
    )]
    struct Foo {
        #[config(default = 1, layer_attr(debug("test {bar:?}")))]
        bar: u32,
    }

    type FooLayer = <Foo as Config>::Layer;

    let foo_layer = FooLayer { bar: Some(1) };
    assert_eq!(
        format!("{foo_layer:?}"),
        "FooLayer { bar: test Some(1) }",
    );

    assert_eq!(format!("{foo_layer}"), "1");
}

#[test]
fn layer_props_nested() {
    mod foo {
        use confique::Config;

        #[allow(dead_code)]
        #[derive(Config)]
        #[config(layer_attr(derive(derive_more::Debug, derive_more::Deref)))]
        pub struct Foo {
            #[config(default = 1, layer_attr(debug("test {bar:?}")), layer_attr(deref))]
            bar: u32,
        }

        #[allow(dead_code)]
        #[derive(Config)]
        #[config(layer_attr(derive(derive_more::Debug)))]
        pub struct Bar {
            #[config(nested, layer_attr(debug("test2 {foo2:?}")))]
            foo2: Foo,
        }
    }

    type FooLayer = <foo::Foo as Config>::Layer;
    type BarLayer = <foo::Bar as Config>::Layer;

    let foo_layer = FooLayer { bar: Some(1) };
    assert_eq!(*foo_layer, Some(1));

    let bar_layer = BarLayer { foo2: foo_layer };
    assert_eq!(
        format!("{bar_layer:?}"),
        "BarLayer { foo2: test2 FooLayer { bar: test Some(1) } }",
    );
}