diff --git a/pttodoer/src/main.rs b/pttodoer/src/main.rs index 3186372..37a0b07 100644 --- a/pttodoer/src/main.rs +++ b/pttodoer/src/main.rs @@ -20,7 +20,7 @@ fn main() { Some(sch) => Task::from_string_schedule(s, sch), None => Task::from_string(s), }; - db.0[0].tasks.0.push(t); + db.tasks_and_metadatas[0].tasks.0.push(t); }, _ => {}, }; @@ -64,7 +64,10 @@ impl Flags { } #[derive(Debug, PartialEq)] -pub struct DB(Vec); +pub struct DB { + tasks_and_metadatas: Vec, + cwd: String, +} impl DB { pub fn new(path: String) -> Result { @@ -95,16 +98,22 @@ impl DB { let item = TasksAndMetadata::new(file)?; result.push(item); } - Ok(DB(result)) + Ok(DB{ + tasks_and_metadatas: result, + cwd: match metadata.is_file() { + true => std::path::Path::new(&path).parent().expect("root?").display().to_string(), + _ => path.clone(), + }, + }) } - fn new_empty() -> DB { - DB{0: vec![]} + fn new_empty(cwd: String) -> DB { + DB{tasks_and_metadatas: vec![], cwd: cwd.clone()} } pub fn incomplete(&self) -> Tasks { let mut result = Tasks::new(); - for set in &self.0 { + for set in &self.tasks_and_metadatas { result.0.extend(set.tasks.incomplete().0); } result @@ -112,7 +121,7 @@ impl DB { pub fn due(&self) -> Tasks { let mut result = Tasks::new(); - for set in &self.0 { + for set in &self.tasks_and_metadatas { result.0.extend(set.tasks.due().0); } result @@ -133,7 +142,7 @@ impl DB { fn _edit(&self, edit: impl Fn(&String)) -> Result { let d = TempDir::new(&TS::now().to_string()).expect("failed to create a temp dir"); - for set in &self.0 { + for set in &self.tasks_and_metadatas { let base = set.file.split("/").last().unwrap().to_string(); let f = d.path().join(base); set.save_due_as(f.display().to_string())?; @@ -155,17 +164,14 @@ impl DB { for f in std::fs::read_dir(d.path()).expect("failed to list edited files") { let f = f.expect("failed to list edited file").path(); let base = f.display().to_string().split("/").last().unwrap().to_string(); - let set = match self.0 + let set = match self.tasks_and_metadatas .iter() .filter(|tasks_and_metadata| tasks_and_metadata.file.ends_with(format!("/{}", base).as_str())) .nth(0) { Some(set) => set.clone(), None => TasksAndMetadata::new_with( format!("{}/{}", - std::path::Path::new(self.0[0].file.as_str()) - .parent().expect("root?") - .display() - .to_string(), + self.cwd, base, ), TS::now(), @@ -222,11 +228,11 @@ impl DB { )); } - Ok(DB{0: result}) + Ok(DB{tasks_and_metadatas: result, cwd: self.cwd.clone()}) } pub fn save(&self, dry_run: bool) -> Result<(), String> { - for i in &self.0 { + for i in &self.tasks_and_metadatas { i.save(dry_run)?; } Ok(()) @@ -252,28 +258,28 @@ mod test_db { }).expect("failed to not edit"); assert_ne!(db, db_after); - assert_eq!(2, db_after.0.len()); - assert_eq!(1, db_after.0[1].tasks.len()); - assert_eq!(2, db_after.0[0].tasks.len()); + assert_eq!(2, db_after.tasks_and_metadatas.len()); + assert_eq!(1, db_after.tasks_and_metadatas[1].tasks.len()); + assert_eq!(2, db_after.tasks_and_metadatas[0].tasks.len()); } #[test] fn edit_noop_empty() { let db = new_test_db(0, 0); let db_after = db._edit(|_| {}).expect("failed to not edit"); - assert_eq!(0, db.0.len()); + assert_eq!(0, db.tasks_and_metadatas.len()); assert_eq!(db, db_after); } fn new_test_db(files: i32, tasks_per_file: i32) -> DB { - let mut db = DB::new_empty(); + let mut db = DB::new_empty("".to_string()); for i in 0..files { let mut tasks = Tasks::new(); for j in 0..tasks_per_file { tasks.0.push(Task::from_string(format!("{{\"hello\": \"world[{}]\"}}", j))); } - db.0.push(TasksAndMetadata::new_with( + db.tasks_and_metadatas.push(TasksAndMetadata::new_with( format!("{}.yaml", i), TS::now(), tasks, @@ -285,7 +291,7 @@ mod test_db { #[test] fn read_dir_files() { let db = DB::new("./src/testdata/taskss.d/files.d".to_string()).expect("failed to construct from dir of files"); - assert_eq!(2, db.0.len()); + assert_eq!(2, db.tasks_and_metadatas.len()); assert_eq!(2, db.due().len()); assert_eq!(2, db.incomplete().len()); } @@ -293,7 +299,7 @@ mod test_db { #[test] fn read_dir_file() { let db = DB::new("./src/testdata/taskss.d/file.d".to_string()).expect("failed to construct from dir of a single file"); - assert_eq!(1, db.0.len()); + assert_eq!(1, db.tasks_and_metadatas.len()); assert_eq!(1, db.due().len()); assert_eq!(1, db.incomplete().len()); } @@ -301,7 +307,7 @@ mod test_db { #[test] fn read_single_file() { let db = DB::new("./src/testdata/taskss.d/single_file.yaml".to_string()).expect("failed to construct from single file"); - assert_eq!(1, db.0.len()); + assert_eq!(1, db.tasks_and_metadatas.len()); assert_eq!(1, db.due().len()); assert_eq!(2, db.incomplete().len()); }