miniconf 0.20.1

Serialize/deserialize/access reflection for trees
Documentation
use miniconf::{Indices, KeyError, Path, Shape, Short, Track, Tree, TreeSchema};
mod common;

#[test]
fn borrowed() {
    let mut a = "";
    miniconf::json_core::set(&mut a, "", "\"foo\"".as_bytes()).unwrap();
    assert_eq!(a, "foo");
}

#[cfg(feature = "postcard")]
#[test]
fn borrowed_u8() {
    use postcard::{de_flavors::Slice, to_slice};

    let mut a = &[0u8; 0][..];
    let mut buf = [0u8; 32];
    let data = to_slice(&[1u8, 2, 3][..], &mut buf).unwrap();
    miniconf::postcard::set_by_key(&mut a, [0; 0], Slice::new(data)).unwrap();
    assert_eq!(a, &[1, 2, 3]);
}

#[derive(Tree, Default)]
struct Inner {
    inner: f32,
}

#[derive(Tree, Default)]
struct Settings {
    a: f32,
    b: i32,
    c: Inner,
}

#[test]
fn meta() {
    const SHAPE: Shape = Settings::SCHEMA.shape();
    assert_eq!(SHAPE.max_depth, 2);
    assert_eq!(SHAPE.max_length("/"), "/c/inner".len());
    assert_eq!(SHAPE.count.get(), 3);
}

#[test]
fn path() {
    for (keys, path, depth, leaf) in [
        (&[1usize][..], "/b", 1, true),
        (&[2, 0], "/c/inner", 2, true),
        (&[2], "/c", 1, false),
        (&[], "", 0, false),
    ] {
        let s = Settings::SCHEMA
            .transcode::<Short<Track<Path<String, '/'>>>>(keys)
            .unwrap();
        assert_eq!(depth, s.inner().depth());
        assert_eq!(leaf, s.leaf());
        assert_eq!(s.inner().inner().as_ref(), path);
    }
}

#[test]
fn indices() {
    for (keys, idx, leaf) in [
        ("", &[][..], false),
        ("/b", &[1], true),
        ("/c/inner", &[2, 0], true),
        ("/c", &[2], false),
    ] {
        let indices = Settings::SCHEMA
            .transcode::<Short<Indices<[usize; 2]>>>(Path::<_, '/'>(keys))
            .unwrap();
        println!("{keys} {indices:?}");
        assert_eq!(indices.leaf(), leaf);
        assert_eq!(indices.inner().as_ref(), idx);
    }
    let indices = Option::<i8>::SCHEMA
        .transcode::<Short<Indices<[usize; 1]>>>([0usize; 0])
        .unwrap();
    assert_eq!(indices.inner().as_ref(), [0usize; 0]);
    assert_eq!(indices.leaf(), true);
    assert_eq!(indices.inner().len(), 0);

    let mut it = [0usize; 4].into_iter();
    assert_eq!(
        Settings::SCHEMA.transcode::<Indices<[usize; 2]>>(&mut it),
        Err(KeyError::TooLong.into())
    );
    assert_eq!(it.count(), 2);
}

#[test]
fn tuple() {
    type T = (u32, (i32, u8), [u16; 3]);
    let paths = common::paths::<T, 3>();
    assert_eq!(paths.len(), 6);
    let mut s: T = Default::default();
    for p in paths {
        common::set_get(&mut s, p.as_str(), b"9");
    }
    assert_eq!(s, (9, (9, 9), [9; 3]));
}

#[test]
fn cell() {
    use core::cell::RefCell;

    let c: RefCell<i32> = Default::default();
    let mut r = &c;
    common::set_get(&mut r, "", b"9");
}