conflag 0.1.1

A simple and powreful configuration language, extending JSON with declarative and functional language features.
Documentation
#![feature(assert_matches)]
use std::assert_matches::assert_matches;

use conflag;
use conflag::{BuiltinFn, Error, Value};

#[test]
fn test_builtin() {
    let v = conflag::parse("if").unwrap();
    assert_matches!(&*v, Value::BuiltinFn(BuiltinFn(name, ..)) if name == "if");
}

#[test]
fn test_builtin_missing() {
    let v = conflag::parse("__no_such_builtin__");
    assert!(v.is_err());
    assert_matches!(v, Err(Error::NameResolutionError(..)));
}

#[test]
fn test_local() {
    let v = conflag::parse(
        r#"{
        a: 1,
        test: a,
    }.test"#,
    )
    .unwrap();
    assert_matches!(*v, Value::Number(n) if n == 1.);
}

#[test]
fn test_local_shadows_builtin() {
    let v = conflag::parse(
        r#"{
        if: 1,
        test: if,
    }.test"#,
    )
    .unwrap();
    assert_matches!(*v, Value::Number(n) if n == 1.);
}

#[test]
fn test_inner() {
    let v = conflag::parse(
        r#"{
        a: 1,
        test: {
            b: a,
        }.b,
    }.test"#,
    )
    .unwrap();
    assert_matches!(*v, Value::Number(n) if n == 1.);
}

#[test]
fn test_inner_multiple_scopes() {
    let v = conflag::parse(
        r#"{
        a: 1,
        test: {
            b: {
                c: a,
            },
        }.b.c,
    }.test"#,
    )
    .unwrap();
    assert_matches!(*v, Value::Number(n) if n == 1.);
}

#[test]
fn test_inner_shadows_outer() {
    let v = conflag::parse(
        r#"{
        a: 1,
        test: {
            a: 2,
            b: a,
        }.b,
    }.test"#,
    )
    .unwrap();
    assert_matches!(*v, Value::Number(n) if n == 2.);
}