serde: Use log framework
[learn-rust.git] / serde / src / main.rs
index 1357100b79351126faa8f046e27aa378611ff246..fc88d23c418c5872db2d7df475506038a1644949 100644 (file)
@@ -1,6 +1,10 @@
 use std::fs;
+use std::error::Error;
+
 use serde::{Serialize, Deserialize};
 
+const DB_PATH: &str = "/tmp/contacts.json";
+
 #[derive(Serialize, Deserialize, Debug)]
 enum Social {
     Twitter(String),
@@ -25,15 +29,24 @@ fn build_contacts() -> Contacts {
     ]
 }
 
-fn create_contacts() {
+fn create_contacts() -> Result<(), Box<dyn Error>> {
     let contacts = build_contacts();
-    // FIXME: Use ? and return Result
-    let serialized = serde_json::to_string(&contacts).unwrap();
-    println!("serialized: {}", serialized);
-    let mut f = fs::File::create("/tmp/contacts.json").unwrap_or_else(|e| panic!("Could not create /tmp/contacts.json: {:?}", e));
-    serde_json::to_writer_pretty(&mut f, &contacts).unwrap_or_else(|e| panic!("Could not serialize contacts: {:?}", e));
+    let serialized = serde_json::to_string(&contacts)?;
+    log::debug!("serialized: {}", &serialized);
+    let mut f = fs::File::create(DB_PATH)?;
+    serde_json::to_writer_pretty(&mut f, &contacts)?;
+    Ok(())
+}
+
+fn load_contacts() -> Result<Contacts, Box<dyn Error>> {
+    let f = fs::File::open(DB_PATH)?;
+    Ok(serde_json::from_reader(f)?)
 }
 
-fn main() {
-    create_contacts();
+fn main() -> Result<(), Box<dyn Error>> {
+    env_logger::init();
+    create_contacts()?;
+    let contacts = load_contacts()?;
+    println!("deserialized: {:?}", &contacts);
+    Ok(())
 }