miniconf 0.20.1

Serialize/deserialize/access reflection for trees
Documentation
use miniconf::{Tree, json_core};

mod common;
use common::*;

#[derive(Tree, Default, PartialEq, Debug)]
struct Inner {
    a: i32,
}

#[test]
fn struct_flatten() {
    #[derive(Tree, Default, PartialEq, Debug)]
    #[tree(flatten)]
    struct S1 {
        a: i32,
    }
    assert_eq!(paths::<S1, 1>(), [""]);
    let mut s = S1::default();
    set_get(&mut s, "", b"1");
    assert_eq!(s.a, 1);

    #[derive(Tree, Default, PartialEq, Debug)]
    #[tree(flatten)]
    struct S2(i32);
    assert_eq!(paths::<S2, 1>(), [""]);
    let mut s = S2::default();
    set_get(&mut s, "", b"1");
    assert_eq!(s.0, 1);

    #[derive(Tree, Default, PartialEq, Debug)]
    #[tree(flatten)]
    struct S3(Inner);
    assert_eq!(paths::<S3, 1>(), ["/a"]);
    let mut s = S3::default();
    set_get(&mut s, "/a", b"1");
    assert_eq!(s.0.a, 1);
}

#[test]
fn enum_flatten() {
    #[derive(Tree, Default, PartialEq, Debug)]
    #[tree(flatten)]
    enum E1 {
        #[default]
        None,
        A(i32),
    }
    assert_eq!(paths::<E1, 1>(), [""]);
    let mut e = E1::A(0);
    set_get(&mut e, "", b"1");
    assert_eq!(e, E1::A(1));
    assert_eq!(
        json_core::set(&mut E1::None, "", b"1").unwrap_err(),
        miniconf::ValueError::Absent.into()
    );

    #[derive(Tree, Default, PartialEq, Debug)]
    #[tree(flatten)]
    enum E2 {
        #[default]
        None,
        A(Inner),
    }
    assert_eq!(paths::<E2, 1>(), ["/a"]);
    let mut e = E2::A(Inner::default());
    set_get(&mut e, "/a", b"1");
    assert_eq!(e, E2::A(Inner { a: 1 }));
    assert_eq!(
        json_core::set(&mut E2::None, "/a", b"1").unwrap_err(),
        miniconf::ValueError::Absent.into()
    );
}