diff options
Diffstat (limited to 'third_party/rust/basic-toml/examples/decode.rs')
-rw-r--r-- | third_party/rust/basic-toml/examples/decode.rs | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/third_party/rust/basic-toml/examples/decode.rs b/third_party/rust/basic-toml/examples/decode.rs new file mode 100644 index 0000000000..21e438294a --- /dev/null +++ b/third_party/rust/basic-toml/examples/decode.rs @@ -0,0 +1,54 @@ +//! An example showing off the usage of `Deserialize` to automatically decode +//! TOML into a Rust `struct` + +#![deny(warnings)] +#![allow(dead_code)] + +use serde_derive::Deserialize; + +/// 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 = basic_toml::from_str(toml_str).unwrap(); + println!("{:#?}", decoded); +} |