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