Expand description

A TOML-parsing library

This library implements a TOML v0.5.0 compatible parser, primarily supporting the serde library for encoding/decoding various types in Rust

NOTE: Unlike the core toml_edit API, this is not format preserving but is a drop-in replacement for toml-rs for those needing both toml_edit and toml-rs but want either consistency in behavior or to reduce their dependencies.

TOML itself is a simple, ergonomic, and readable configuration format:

[package]
name = "toml"
version = "0.4.2"
authors = ["Alex Crichton <alex@alexcrichton.com>"]

[dependencies]
serde = "1.0"

The TOML format tends to be relatively common throughout the Rust community for configuration, notably being used by Cargo, Rust’s package manager.

TOML values

A value in TOML is represented with the Value enum in this crate.

TOML is similar to JSON with the notable addition of a Datetime type. In general, TOML and JSON are interchangeable in terms of formats.

Parsing TOML

The easiest way to parse a TOML document is via the Value type:

use toml_edit::easy::Value;

let value = "foo = 'bar'".parse::<Value>().unwrap();

assert_eq!(value["foo"].as_str(), Some("bar"));

The Value type implements a number of convenience methods and traits; the example above uses FromStr to parse a str into a Value.

Deserialization and Serialization

This crate supports serde 1.0 with a number of implementations of the Deserialize, Serialize, Deserializer, and Serializer traits. Namely, you’ll find:

  • Deserialize for Value
  • Serialize for Value
  • Deserialize for Datetime
  • Serialize for Datetime
  • Deserializer for de::Deserializer
  • Serializer for ser::Serializer
  • Deserializer for Value

This means that you can use Serde to deserialize/serialize the Value type as well as the Datetime type in this crate. You can also use the Deserializer, Serializer, or Value type itself to act as a deserializer/serializer for arbitrary types.

An example of deserializing with TOML is:

use serde::Deserialize;

#[derive(Deserialize)]
struct Config {
    ip: String,
    port: Option<u16>,
    keys: Keys,
}

#[derive(Deserialize)]
struct Keys {
    github: String,
    travis: Option<String>,
}

let config: Config = toml_edit::easy::from_str(r#"
    ip = '127.0.0.1'

    [keys]
    github = 'xxxxxxxxxxxxxxxxx'
    travis = 'yyyyyyyyyyyyyyyyy'
"#).unwrap();

assert_eq!(config.ip, "127.0.0.1");
assert_eq!(config.port, None);
assert_eq!(config.keys.github, "xxxxxxxxxxxxxxxxx");
assert_eq!(config.keys.travis.as_ref().unwrap(), "yyyyyyyyyyyyyyyyy");

You can serialize types in a similar fashion:

use serde::Serialize;

#[derive(Serialize)]
struct Config {
    ip: String,
    port: Option<u16>,
    keys: Keys,
}

#[derive(Serialize)]
struct Keys {
    github: String,
    travis: Option<String>,
}

let config = Config {
    ip: "127.0.0.1".to_string(),
    port: None,
    keys: Keys {
        github: "xxxxxxxxxxxxxxxxx".to_string(),
        travis: Some("yyyyyyyyyyyyyyyyy".to_string()),
    },
};

let toml = toml_edit::easy::to_string(&config).unwrap();

Re-exports

pub use crate::de;
pub use crate::ser;
pub use de::from_document;
pub use de::from_slice;
pub use de::from_str;
pub use de::Deserializer;
pub use ser::to_document;
pub use ser::to_string;
pub use ser::to_string_pretty;
pub use ser::to_vec;
pub use ser::Serializer;
pub use value::Value;

Modules

A map of String to toml::Value.

Definition of a TOML value

Macros

Construct a toml_edit::easy::Value from TOML syntax.