tom 0.0.1

Yet another format-preserving TOML parser/manipulator.
Documentation
use std::iter;
use testutils::assert_eq_text;
use tom::{CstNode, TomlDoc};

#[test]
fn create_key_with_space() {
    check(|doc| doc.new_key("foo bar"), "\"foo bar\"");
}

#[test]
fn create_entry() {
    check(
        |doc| {
            let key = doc.new_key("foo");
            let val = doc.new_value("1.0");
            doc.new_entry(iter::once(key), val)
        },
        r#"foo = "1.0""#,
    );
}

#[test]
fn create_dict() {
    check(
        |doc| {
            let a = doc.new_entry_from_text("foo = \"1.0\"");
            let b = doc.new_entry_from_text("bar = \"0.0.1\"");
            doc.new_value_dict(vec![a, b].into_iter())
        },
        r#"{ foo = "1.0", bar = "0.0.1" }"#,
    );
}

#[test]
fn create_array() {
    check(
        |doc| {
            let a = doc.new_value(92);
            let b = doc.new_value(62);
            doc.new_value_array(vec![a, b].into_iter())
        },
        "[ 92, 62 ]",
    );
}

#[test]
fn create_table() {
    check(
        |doc| {
            let a = doc.new_entry_from_text("foo = \"1.0\"");
            let b = doc.new_entry_from_text("bar = \"0.0.1\"");
            let mut keys = Vec::new();
            for key in "target x86_64.json dependencies".split_whitespace() {
                keys.push(doc.new_key(key));
            }
            doc.new_table(keys.into_iter(), vec![a, b].into_iter())
        },
        r#"[target."x86_64.json".dependencies]
foo = "1.0"
bar = "0.0.1""#,
    );
}

#[test]
fn create_array_table() {
    check(
        |doc| {
            let a = doc.new_entry_from_text("name = \"foo\"");
            let key = doc.new_key("bin");

            doc.new_array_table(iter::once(key), iter::once(a)).cst()
        },
        r#"[[bin]]
name = "foo""#,
    );
}

fn check<F: FnOnce(&mut TomlDoc) -> R, R: Into<CstNode>>(f: F, expected: &str) {
    let mut doc = TomlDoc::new("");
    doc.start_edit();
    let cst = f(&mut doc).into();
    let actual = cst.get_text(&doc);
    assert_eq_text(expected, &actual)
}