• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! An example showing off the usage of `Deserialize` to automatically decode
2 //! TOML into a Rust `struct`
3 
4 #![deny(warnings)]
5 #![allow(dead_code)]
6 
7 use serde::Deserialize;
8 
9 /// This is what we're going to decode into. Each field is optional, meaning
10 /// that it doesn't have to be present in TOML.
11 #[derive(Debug, Deserialize)]
12 struct Config {
13     global_string: Option<String>,
14     global_integer: Option<u64>,
15     server: Option<ServerConfig>,
16     peers: Option<Vec<PeerConfig>>,
17 }
18 
19 /// Sub-structs are decoded from tables, so this will decode from the `[server]`
20 /// table.
21 ///
22 /// Again, each field is optional, meaning they don't have to be present.
23 #[derive(Debug, Deserialize)]
24 struct ServerConfig {
25     ip: Option<String>,
26     port: Option<u64>,
27 }
28 
29 #[derive(Debug, Deserialize)]
30 struct PeerConfig {
31     ip: Option<String>,
32     port: Option<u64>,
33 }
34 
main()35 fn main() {
36     let toml_str = r#"
37         global_string = "test"
38         global_integer = 5
39 
40         [server]
41         ip = "127.0.0.1"
42         port = 80
43 
44         [[peers]]
45         ip = "127.0.0.1"
46         port = 8080
47 
48         [[peers]]
49         ip = "127.0.0.1"
50     "#;
51 
52     let decoded: Config = toml::from_str(toml_str).unwrap();
53     println!("{:#?}", decoded);
54 }
55