serde: Use error propagation
[learn-rust.git] / serde / src / main.rs
1 use std::fs;
2 use std::error::Error;
3 use serde::{Serialize, Deserialize};
4
5 #[derive(Serialize, Deserialize, Debug)]
6 enum Social {
7     Twitter(String),
8     ICQ(u64),
9     Nothing,
10 }
11
12 #[derive(Serialize, Deserialize, Debug)]
13 struct Contact {
14     name: String,
15     phone: u32,
16     social: Social,
17 }
18
19 type Contacts = Vec<Contact>;
20
21 fn build_contacts() -> Contacts {
22     vec![
23         Contact { name: "John".to_string(), phone: 12345, social: Social::Twitter("@the_john".to_string()) },
24         Contact { name: "Mary".to_string(), phone: 9876543, social: Social::ICQ(111234) },
25         Contact { name: "Jane".to_string(), phone: 555555, social: Social::Nothing },
26     ]
27 }
28
29 fn create_contacts() -> Result<(), Box<dyn Error>> {
30     let contacts = build_contacts();
31     let serialized = serde_json::to_string(&contacts)?;
32     println!("serialized: {}", serialized);
33     let mut f = fs::File::create("/tmp/contacts.json")?;
34     serde_json::to_writer_pretty(&mut f, &contacts)?;
35     Ok(())
36 }
37
38 fn main() -> Result<(), Box<dyn Error>> {
39     create_contacts()?;
40     Ok(())
41 }