libconfig-rs 4.0.1

libconfig parser in rust
Documentation
use serde::{Deserialize, Serialize};
use std::collections::HashMap;

#[derive(Deserialize)]
struct Test1 {
    a: i32,
    b: i32,
    c: f32,
}

#[test]
fn test1() {
    let config = r#"config : {
        a : 1;
        b : 2;
        c : 3.3;
    };
    "#;
    let res = libconfig_rs::from_str::<Test1>(config).unwrap();

    assert!(res.a == 1);
    assert!(res.b == 2);
    assert!(res.c == 3.3);
}

#[derive(Deserialize)]
struct Test2(i32);

#[test]
fn test2() {
    let config = r#"config : ( 5 );"#;
    let res = libconfig_rs::from_str::<Test2>(config).unwrap();

    assert!(res.0 == 5);
}

#[derive(Deserialize)]
struct Test3(i32, f32);

#[test]
fn test3() {
    let config = r#"config : ( 5, 1.0 );"#;
    let res = libconfig_rs::from_str::<Test3>(config).unwrap();

    assert!(res.0 == 5);
    assert!(res.1 == 1.0);
}

#[derive(Deserialize)]
struct Test4 {
    a: Vec<i32>,
}

#[test]
fn test4() {
    let config = r#"config : {
        a : ( 1, 2, 3 );
    };
    "#;
    let res = libconfig_rs::from_str::<Test4>(config).unwrap();

    assert!(res.a[0] == 1);
    assert!(res.a[1] == 2);
    assert!(res.a[2] == 3);
}

#[derive(Deserialize)]
struct Test5 {
    a: Option<i32>,
}

#[test]
fn test5() {
    {
        let config = r#"config : {
            a : ( );
        };
        "#;
        let res = libconfig_rs::from_str::<Test5>(config).unwrap();

        assert!(res.a.is_none());
    }

    {
        let config = r#"config : {
            a : ( 2 );
        };
        "#;
        let res = libconfig_rs::from_str::<Test5>(config).unwrap();

        assert!(res.a == Some(2));
    }
}

#[derive(Deserialize)]
struct Test6 {
    #[serde(rename = "*a")]
    _a: (),
}

#[test]
fn test6() {
    {
        let config = r#"config : {
            *a : ();
        };
        "#;
        libconfig_rs::from_str::<Test6>(config).unwrap();
    }
}

#[derive(Deserialize, Serialize, Debug, PartialEq)]
enum TestEnum1 {
    A,
    B,
    C,
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
enum TestEnum2 {
    A(i32),
    B(f32),
    C(String),
}

#[derive(Serialize, Deserialize, Debug, PartialEq)]
enum TestEnum3 {
    A { a: i32 },
    B { b: f32 },
    C { c: String },
}

#[derive(Serialize, Deserialize)]
struct Test7 {
    a: TestEnum1,
    b: TestEnum2,
    c: TestEnum3,
}

#[test]
fn test7() {
    {
        let config = r#"config : {
            a : "A";
            b : {
                A : ( 1 );
            };
            c : {
                A : { a : 1; };
            };
        };"#;
        let t = libconfig_rs::from_str::<Test7>(config).unwrap();
        assert_eq!(t.a, TestEnum1::A);
        assert_eq!(t.b, TestEnum2::A(1));
        assert_eq!(t.c, TestEnum3::A { a: 1 });
    }

    {
        let config = r#"config : {
            a : "B";
            b : {
                B : ( 2.0 );
            };
            c : {
                B : { b : 2.0; };
            };
        };"#;
        let t = libconfig_rs::from_str::<Test7>(config).unwrap();
        assert_eq!(t.a, TestEnum1::B);
        assert_eq!(t.b, TestEnum2::B(2.0));
        assert_eq!(t.c, TestEnum3::B { b: 2.0 });
    }

    {
        let config = r#"config : {
            a : "C";
            b : {
                C : ( "3" );
            };
            c : {
                C : { c : "3"; };
            };
        };"#;
        let t = libconfig_rs::from_str::<Test7>(config).unwrap();
        assert_eq!(t.a, TestEnum1::C);
        assert_eq!(t.b, TestEnum2::C("3".to_owned()));
        assert_eq!(t.c, TestEnum3::C { c: "3".to_owned() });
    }
}

#[derive(Serialize, Deserialize, PartialEq, Debug)]
struct Test8 {
    a: HashMap<i32, String>,
}

#[test]
fn test8() {
    {
        let config = r#"config : {
            a : ( (1, "one"), (2, "two") );
        };"#;
        let t = libconfig_rs::from_str::<Test8>(config).unwrap();
        assert_eq!(t.a[&1], "one");
        assert_eq!(t.a[&2], "two");
    }
}