toml_edit 0.1.1

Yet another format-preserving TOML parser.
Documentation
extern crate toml_edit;

use toml_edit::{Key, Value};

macro_rules! parse {
    ($s:expr, $ty:ty) => (
        {
            let v = $s.parse::<$ty>();
            assert!(v.is_ok());
            v.unwrap()
        }
    );
}

macro_rules! parse_value {
    ($s:expr) => (parse!($s, Value));
}

macro_rules! test_key {
    ($s:expr, $expected:expr) => (
        {
            let key = parse!($s, Key);
            assert_eq!(key.get(), $expected);
        }
    );
}

macro_rules! parse_error {
    ($input:expr, $ty:ty, $err_msg:expr) => (
        {
            let res = $input.parse::<$ty>();
            assert!(res.is_err());
            let err = res.unwrap_err();
            assert!(err.to_string().find($err_msg).is_some());
        }
    );
}

#[test]
fn test_parse_error() {
    parse_error!(r#"["", 2]"#, Value, "Mixed types in array");
    parse_error!("'hello'bla", Value, "Could not parse the line");
    parse_error!(r#"{a = 2"#, Value, "Expected `}`");

    parse_error!("'\"", Key, "Could not parse the line");
}

#[test]
fn test_key_from_str() {
    test_key!("a", "a");
    test_key!(r#"'hello key'"#, "hello key");
    test_key!(
        r#""Jos\u00E9\U000A0000\n\t\r\f\b\\\/\"""#,
        "Jos\u{00E9}\u{A0000}\n\t\r\u{c}\u{8}\\/\""
    );
    test_key!("", "");
    test_key!("'hello key'bla", "'hello key'bla");
    let wp = "C:\\Users\\appveyor\\AppData\\Local\\Temp\\1\\cargo-edit-test.YizxPxxElXn9";
    test_key!(wp, wp);
}

// wat?
#[cfg_attr(feature = "cargo-clippy", allow(panic_params))]
#[test]
fn test_value_from_str() {
    assert!(parse_value!("1979-05-27T00:32:00.999999-07:00").is_date_time());
    assert!(parse_value!("1979-05-27T00:32:00.999999Z").is_date_time());
    assert!(parse_value!("1979-05-27T00:32:00.999999").is_date_time());
    assert!(parse_value!("1979-05-27T00:32:00").is_date_time());
    assert!(parse_value!("1979-05-27").is_date_time());
    assert!(parse_value!("00:32:00").is_date_time());
    assert!(parse_value!("-239").is_integer());
    assert!(parse_value!("1e200").is_float());
    assert!(parse_value!("9_224_617.445_991_228_313").is_float());
    assert!(parse_value!(r#""basic string\nJos\u00E9\n""#).is_str());
    assert!(
        parse_value!(
            r#""""
multiline basic string
""""#
        ).is_str()
    );
    assert!(parse_value!(r#"'literal string\ \'"#).is_str());
    assert!(
        parse_value!(
            r#"'''multiline
literal \ \
string'''"#
        ).is_str()
    );
    assert!(parse_value!(r#"{ hello = "world", a = 1}"#).is_inline_table());
    assert!(
        parse_value!(r#"[ { x = 1, a = "2" }, {a = "a",b = "b",     c =    "c"} ]"#).is_array()
    );
    let wp = "C:\\Users\\appveyor\\AppData\\Local\\Temp\\1\\cargo-edit-test.YizxPxxElXn9";
    let lwp = "'C:\\Users\\appveyor\\AppData\\Local\\Temp\\1\\cargo-edit-test.YizxPxxElXn9'";
    assert_eq!(Value::from(wp).as_str(), parse_value!(lwp).as_str());
    let basic = r#""\\\"\b\/\f\n\r\t\u00E9\U000A0000""#;
    assert_eq!(Value::from(basic).as_str(), parse_value!(basic).as_str());
}