toml_edit 0.22.13

Yet another format-preserving TOML parser.
Documentation
#[test]
fn incomplete_inline_table_issue_296() {
    let err = "native = {".parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(
        r#"TOML parse error at line 1, column 11
  |
1 | native = {
  |           ^
invalid inline table
expected `}`
"#,
        err.to_string(),
    );
}

#[test]
fn bare_value_disallowed_issue_293() {
    let err = "value=zzz".parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(
        r#"TOML parse error at line 1, column 7
  |
1 | value=zzz
  |       ^
invalid string
expected `"`, `'`
"#,
        err.to_string(),
    );
}

#[test]
fn bare_value_in_array_disallowed_issue_293() {
    let err = "value=[zzz]".parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(
        r#"TOML parse error at line 1, column 8
  |
1 | value=[zzz]
  |        ^
invalid array
expected `]`
"#,
        err.to_string(),
    );
}

#[test]
fn duplicate_table_after_dotted_key_issue_509() {
    let err = "
[dependencies.foo]
version = \"0.16\"

[dependencies]
libc = \"0.2\"

[dependencies]
rand = \"0.3.14\"
"
    .parse::<toml_edit::DocumentMut>()
    .unwrap_err();
    snapbox::assert_eq(
        r#"TOML parse error at line 8, column 1
  |
8 | [dependencies]
  | ^
invalid table header
duplicate key `dependencies` in document root
"#,
        err.to_string(),
    );
}

#[test]
fn bad() {
    let toml_input = "a = 01";
    let expected_err = "\
TOML parse error at line 1, column 6
  |
1 | a = 01
  |      ^
expected newline, `#`
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());

    let toml_input = "a = 1__1";
    let expected_err = "\
TOML parse error at line 1, column 7
  |
1 | a = 1__1
  |       ^
invalid integer
expected digit
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());

    let toml_input = "a = 1_";
    let expected_err = "\
TOML parse error at line 1, column 7
  |
1 | a = 1_
  |       ^
invalid integer
expected digit
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());

    let toml_input = "''";
    let expected_err = "\
TOML parse error at line 1, column 3
  |
1 | ''
  |   ^
expected `.`, `=`
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());

    let toml_input = "a = 9e99999";
    let expected_err = "\
TOML parse error at line 1, column 5
  |
1 | a = 9e99999
  |     ^
invalid floating-point number
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());

    let toml_input = "a = \"\u{7f}\"";
    let expected_err = "\
TOML parse error at line 1, column 6
  |
1 | a = \"\u{7f}\"
  |      ^
invalid basic string
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());

    let toml_input = "a = '\u{7f}'";
    let expected_err = "\
TOML parse error at line 1, column 6
  |
1 | a = '\u{7f}'
  |      ^
invalid literal string
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());

    let toml_input = "a = -0x1";
    let expected_err = "\
TOML parse error at line 1, column 7
  |
1 | a = -0x1
  |       ^
expected newline, `#`
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());

    let toml_input = "a = 0x-1";
    let expected_err = "\
TOML parse error at line 1, column 7
  |
1 | a = 0x-1
  |       ^
invalid hexadecimal integer
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());

    // Dotted keys.
    let toml_input = "a.b.c = 1
         a.b = 2
        ";
    let expected_err = "\
TOML parse error at line 2, column 10
  |
2 |          a.b = 2
  |          ^
duplicate key `b` in document root
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());

    let toml_input = "a = 1
         a.b = 2";
    let expected_err = "\
TOML parse error at line 2, column 10
  |
2 |          a.b = 2
  |          ^
dotted key `a` attempted to extend non-table type (integer)
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());

    let toml_input = "a = {k1 = 1, k1.name = \"joe\"}";
    let expected_err = "\
TOML parse error at line 1, column 6
  |
1 | a = {k1 = 1, k1.name = \"joe\"}
  |      ^
dotted key `k1` attempted to extend non-table type (integer)
";
    let err = toml_input.parse::<toml_edit::DocumentMut>().unwrap_err();
    snapbox::assert_eq(expected_err, err.to_string());
}

#[test]
fn emoji_error_span() {
    let input = "😀";
    let err = input.parse::<toml_edit::DocumentMut>().unwrap_err();
    dbg!(err.span());
    let actual = &input[err.span().unwrap()];
    assert_eq!(actual, input);
}

#[test]
fn text_error_span() {
    let input = "asdf";
    let err = input.parse::<toml_edit::DocumentMut>().unwrap_err();
    dbg!(err.span());
    let actual = &input[err.span().unwrap()];
    assert_eq!(actual, "");
}

#[test]
fn fuzzed_68144_error_span() {
    let input = "\"\\ᾂr\"";
    let err = input.parse::<toml_edit::DocumentMut>().unwrap_err();
    dbg!(err.span());
    let actual = &input[err.span().unwrap()];
    assert_eq!(actual, "ᾂ");
}