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.
extern crate toml_edit; use toml_edit::{Document, value}; fn main() { let toml = r#" "hello" = 'toml!' # comment ['a'.b] "#; 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 ['a'.b] c = { d = "hello" } "#; assert_eq!(doc.to_string(), expected); }
Things it does not preserve:
[ 'a'. b] [ "a" .c] [a.d]
will be represented as (spaces are removed, the first encountered quote type is used)
['a'.b] ['a'.c] ['a'.d]
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. If you care about the above two cases, you can use Document::to_string_in_original_order()
to reconstruct tables in their original order.
Licensed under either of
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.