e256931e9b
This commit completely rewrites this crate from the ground up, supporting serde at the lowest levels as I believe serde support was intended to do. This is a major change from the previous versions of this crate, with a summary of changes being: * Serialization directly to TOML is now supported without going through a `Value` first. * Deserialization directly from TOML is now supported without going through a `Value`. Note that due to the TOML format some values still are buffered in intermediate memory, but overall this should be at a minimum now. * The API of `Value` was overhauled to match the API of `serde_json::Value`. The changes here were to: * Add `is_*` accessors * Add `get` and `get_mut` for one-field lookups. * Implement panicking lookups through `Index` The old `index` methods are now gone in favor of `get` and `Index` implementations. * A `Datetime` type has been added to represent a TOML datetime in a first-class fashion. Currently this type provides no accessors other than a `Display` implementation, but the idea is that this will grow support over time for decomposing the date. * Support for the `rustc-serialize` crate has been dropped, that'll stay on the 0.2 and 0.1 release trains. * This crate no longer supports the detection of unused fields, for that though you can use the `serde_ignored` crate on crates.io
58 lines
1.3 KiB
Rust
58 lines
1.3 KiB
Rust
//! An example showing off the usage of `Deserialize` to automatically decode
|
|
//! TOML into a Rust `struct`
|
|
//!
|
|
//! Note that this works similarly with `serde` as well.
|
|
|
|
#![deny(warnings)]
|
|
|
|
extern crate toml;
|
|
#[macro_use]
|
|
extern crate serde_derive;
|
|
|
|
/// This is what we're going to decode into. Each field is optional, meaning
|
|
/// that it doesn't have to be present in TOML.
|
|
#[derive(Debug, Deserialize)]
|
|
struct Config {
|
|
global_string: Option<String>,
|
|
global_integer: Option<u64>,
|
|
server: Option<ServerConfig>,
|
|
peers: Option<Vec<PeerConfig>>,
|
|
}
|
|
|
|
/// Sub-structs are decoded from tables, so this will decode from the `[server]`
|
|
/// table.
|
|
///
|
|
/// Again, each field is optional, meaning they don't have to be present.
|
|
#[derive(Debug, Deserialize)]
|
|
struct ServerConfig {
|
|
ip: Option<String>,
|
|
port: Option<u64>,
|
|
}
|
|
|
|
#[derive(Debug, Deserialize)]
|
|
struct PeerConfig {
|
|
ip: Option<String>,
|
|
port: Option<u64>,
|
|
}
|
|
|
|
fn main() {
|
|
let toml_str = r#"
|
|
global_string = "test"
|
|
global_integer = 5
|
|
|
|
[server]
|
|
ip = "127.0.0.1"
|
|
port = 80
|
|
|
|
[[peers]]
|
|
ip = "127.0.0.1"
|
|
port = 8080
|
|
|
|
[[peers]]
|
|
ip = "127.0.0.1"
|
|
"#;
|
|
|
|
let decoded: Config = toml::from_str(toml_str).unwrap();
|
|
println!("{:#?}", decoded);
|
|
}
|