toml_edit 0.1.1

Yet another format-preserving TOML parser.
# toml_edit

[![Build Status](](
[![Build Status](](
[![Join the chat at](](

This crate allows you to parse and modify toml
documents, while preserving comments, spaces* and
relative order* or items.

`toml_edit` is primarily tailored for [cargo-edit]( needs.

## Example

extern crate toml_edit;

use toml_edit::{Document, value};

fn main() {
    let toml = r#"
"hello" = 'toml!' # comment
    let mut doc = toml.parse::<Document>().expect("invalid doc");
    assert_eq!(doc.to_string(), toml);
    // let's add a new key/value pair inside a.b: c = {d = "hello"}
    doc["a"]["b"]["c"]["d"] = value("hello");
    // autoformat inline table a.b.c: { d = "hello" }
    doc["a"]["b"]["c"].as_inline_table_mut().map(|t| t.fmt());
    let expected = r#"
"hello" = 'toml!' # comment
c = { d = "hello" }
    assert_eq!(doc.to_string(), expected);

## Limitations

*Things it does not preserve:
1. Different quotes and spaces around the same table key, e.g. 
[ 'a'. b]
[ "a"  .c]
will be represented as (spaces are removed, the first encountered quote type is used)
2. Children tables before parent table (tables are reordered, see [test]).
3. Scattered array of tables (tables are reordered, see [test]).

The reason behind the first limitation is that `Table` does not store its header, 
allowing us to safely swap two tables (we store a mapping in each table: child key -> child table).

This last two limitations allow us to represent a toml document as a tree-like data structure, 
which enables easier implementation of editing operations 
and an easy to use and type-safe API.

## License

Licensed under either of

- Apache License, Version 2.0 ([LICENSE-APACHE]LICENSE-APACHE or

### Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.