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