toml_edit

Build Status Build Status codecov crates.io docs Join the chat at https://gitter.im/toml_edit/Lobby

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

```rust extern crate toml_edit;

use toml_edit::{Document, value};

fn main() { let toml = r#" "hello" = 'toml!' # comment ['a'.b] "#; let mut doc = toml.parse::().expect("invalid doc"); asserteq!(doc.tostring(), 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"].asinlinetablemut().map(|t| t.fmt()); let expected = r#" "hello" = 'toml!' # comment ['a'.b] c = { d = "hello" } "#; asserteq!(doc.to_string(), expected); } ```

Limitations

*Things it does not preserve: 1. Different quotes and spaces around the same table key, e.g. toml [ 'a'. b] [ "a" .c] [a.d] will be represented as (spaces are removed, the first encountered quote type is used) toml ['a'.b] ['a'.c] ['a'.d] 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

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.