101 releases
| 0.9.11+spec-1.1.0 | Jan 9, 2026 |
|---|---|
| 0.9.10+spec-1.1.0 | Dec 18, 2025 |
| 0.9.8 | Oct 9, 2025 |
| 0.9.4 | Jul 30, 2025 |
| 0.1.3 | Nov 22, 2014 |
#8 in Encoding
18,353,321 downloads per month
Used in 26,668 crates
(8,575 directly)
410KB
10K
SLoC
toml
A serde-compatible TOML decoder and encoder for Rust.
For format-preserving editing or finer control over output, see toml_edit
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/license/mit)
at your option.
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.
lib.rs:
A serde-compatible TOML-parsing library
TOML itself is a simple, ergonomic, and readable configuration format:
[package]
name = "toml"
[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 TOML document is represented with the Table type which maps String to the Value enum:
pub enum Value {
String(String),
Integer(i64),
Float(f64),
Boolean(bool),
Datetime(Datetime),
Array(Array),
Table(Table),
}
Parsing TOML
The easiest way to parse a TOML document is via the Table type:
use toml::Table;
let value = "foo = 'bar'".parse::<Table>().unwrap();
assert_eq!(value["foo"].as_str(), Some("bar"));
The Table type implements a number of convenience methods and
traits; the example above uses FromStr to parse a [str] into a
Table.
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 TableSerialize for TableDeserialize for ValueSerialize for ValueDeserialize for DatetimeSerialize for DatetimeDeserializer for de::DeserializerSerializer for ser::SerializerDeserializer for TableDeserializer for Value
This means that you can use Serde to deserialize/serialize the
Table type as well as Value and Datetime type in this crate. You can also
use the Deserializer, Serializer, or Table 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::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::to_string(&config).unwrap();
Dependencies
~0–2.7MB
~52K SLoC