o that swap wasnt too bd

master
Bel LaPointe 2024-08-08 13:25:38 -07:00
parent a5f5013ef6
commit 33d318edd4
1 changed files with 30 additions and 24 deletions

View File

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