diff --git a/src/main.rs b/src/main.rs index e6d09eb..db014b3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use serde::{Serialize, Deserialize}; -use std::io::Read; +use std::io::{Read, Write}; use std::fs::File; fn main() { @@ -18,6 +18,21 @@ struct Add { tag: String, } +fn save_storage(path: String, storage: Storage) -> Result<(), String> { + match File::create(path.clone()) { + Ok(mut writer) => _save_storage(&mut writer, storage), + Err(reason) => Err(format!("failed to open {} to save storage: {}", path, reason)), + } +} + +fn _save_storage(writer: &mut dyn Write, storage: Storage) -> Result<(), String> { + let mut w = serde_yaml::Serializer::new(writer); + match storage.serialize(&mut w) { + Ok(_) => Ok(()), + Err(reason) => Err(format!("failed to serialize storage: {}", reason)), + } +} + fn load_storage(path: String) -> Result { match File::open(path.clone()) { Ok(mut reader) => _load_storage(&mut reader), @@ -37,19 +52,28 @@ mod tests { use super::*; #[test] - fn test_load_storage() { + fn test_save_load_empty() { let got = _load_storage(&mut "adds: []".as_bytes()).expect("failed to parse 'adds: []' storage"); assert_eq!(got, Storage{adds: vec![]}); + + let mut w = vec![]; + _save_storage(&mut w, got).expect("failed saving storage to writer"); + assert_eq!(String::from_utf8(w).unwrap(), "adds: []\n".to_string()); } #[test] fn test_testdata_standalone_yaml() { + let want = Storage{adds: vec![ + Add{t: 1, add: "def".to_string(), tag: "abc".to_string()}, + Add{t: 2, add: "ghi".to_string(), tag: "".to_string()}, + ]}; assert_eq!( load_storage("./src/testdata/standalone.yaml".to_string()).expect("cant load standalone.yaml"), - Storage{adds: vec![ - Add{t: 1, add: "def".to_string(), tag: "abc".to_string()}, - Add{t: 2, add: "ghi".to_string(), tag: "".to_string()}, - ]}, + want, ); + + let mut w = vec![]; + _save_storage(&mut w, want).expect("failed saving storage to writer"); + assert_eq!(String::from_utf8(w).unwrap(), "adds:\n- t: 1\n add: def\n tag: abc\n- t: 2\n add: ghi\n tag: ''\n".to_string()); } }