diff --git a/src/main.rs b/src/main.rs index 9a8f373..e6d09eb 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,6 @@ use serde::{Serialize, Deserialize}; +use std::io::Read; +use std::fs::File; fn main() { println!("Hello, world!"); @@ -17,17 +19,33 @@ struct Add { } fn load_storage(path: String) -> Result { - Err("failed".to_string()) + match File::open(path.clone()) { + Ok(mut reader) => _load_storage(&mut reader), + Err(reason) => Err(format!("failed to read storage {}: {}", path, reason)), + } +} + +fn _load_storage(reader: &mut dyn Read) -> Result { + match serde_yaml::from_reader::<&mut dyn Read, Storage>(reader) { + Ok(storage) => Ok(storage), + Err(err) => Err(format!("failed to parse storage: {}", err)), + } } #[cfg(test)] mod tests { use super::*; + #[test] + fn test_load_storage() { + let got = _load_storage(&mut "adds: []".as_bytes()).expect("failed to parse 'adds: []' storage"); + assert_eq!(got, Storage{adds: vec![]}); + } + #[test] fn test_testdata_standalone_yaml() { assert_eq!( - load_storage("./testdata/standalone.yaml".to_string()).expect("cant load standalone.yaml"), + 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()}, diff --git a/src/testdata/standalone.yaml b/src/testdata/standalone.yaml index 423b48d..196d27a 100644 --- a/src/testdata/standalone.yaml +++ b/src/testdata/standalone.yaml @@ -4,3 +4,4 @@ adds: tag: abc - t: 2 add: ghi + tag: ""