master
Bel LaPointe 2024-08-08 12:53:15 -07:00
parent 602939b25c
commit 5c74ec0c15
1 changed files with 73 additions and 19 deletions

View File

@ -63,7 +63,7 @@ impl Flags {
} }
} }
#[derive(Debug)] #[derive(Debug, PartialEq)]
pub struct DB(Vec<TasksAndMetadata>); pub struct DB(Vec<TasksAndMetadata>);
impl DB { impl DB {
@ -98,6 +98,10 @@ impl DB {
Ok(DB(result)) Ok(DB(result))
} }
fn new_empty() -> DB {
DB{0: vec![]}
}
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.0 {
@ -115,6 +119,19 @@ impl DB {
} }
pub fn edit(&self) -> Result<DB, String> { pub fn edit(&self) -> Result<DB, String> {
self._edit(|cwd: &String| {
std::process::Command::new("/bin/sh")
.current_dir(cwd)
.arg("-c")
.arg("vim -p ./*")
.spawn()
.expect("failed to start vim")
.wait()
.expect("failed to vim");
})
}
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.0 {
let base = set.file.split("/").last().unwrap().to_string(); let base = set.file.split("/").last().unwrap().to_string();
@ -123,19 +140,11 @@ impl DB {
} }
loop { loop {
std::process::Command::new("/bin/sh") let cwd = d.path().display().to_string();
.current_dir(d.path()) edit(&cwd);
.arg("-c")
.arg("vim -p ./*")
.spawn()
.expect("failed to start vim")
.wait()
.expect("failed to vim");
let mut ok = true; let mut ok = true;
for set in &self.0 { for f in std::fs::read_dir(&cwd).expect("failed to list edited files") {
let base = set.file.split("/").last().unwrap().to_string(); ok = ok && TasksAndMetadata::new(f.expect("failed to list edited file").path().display().to_string()).is_ok();
let f = d.path().join(base);
ok = ok && TasksAndMetadata::new(f.display().to_string()).is_ok();
} }
if ok { if ok {
break; break;
@ -143,9 +152,10 @@ impl DB {
} }
let mut result = vec![]; let mut result = vec![];
for set in &self.0 { for f in std::fs::read_dir(d.path()).expect("failed to list edited files") {
let base = set.file.split("/").last().unwrap().to_string(); let f = f.expect("failed to list edited file");
let f = d.path().join(base); let base = f.path().display().to_string().split("/").last().unwrap().to_string();
let set = match{ TODO find self.0.find(path.base(f)) OR init TasksAndMetadata{} }
let edited = TasksAndMetadata::new(f.display().to_string()).expect("failed to read edited tasks"); let edited = TasksAndMetadata::new(f.display().to_string()).expect("failed to read edited tasks");
@ -208,9 +218,53 @@ impl DB {
} }
#[cfg(test)] #[cfg(test)]
mod test_taskss { mod test_db {
use super::*; use super::*;
#[test]
fn edit_insert_empty() {
let db = new_test_db(0, 0);
let db_after = db._edit(|cwd| {
assert_eq!(0, std::fs::read_dir(cwd).expect("failed to ls cwd").collect::<Vec<_>>().len());
assert_ne!("", cwd);
let mut f = std::fs::File::create(format!("{}/f", cwd)).expect("failed to open a file in cwd");
f.write_all(b"f").expect("failed to write a file in cwd");
let mut g = std::fs::File::create(format!("{}/g", cwd)).expect("failed to open a file in cwd");
g.write_all(b"g: h").expect("failed to write a file in cwd");
}).expect("failed to not edit");
assert_eq!(2, db.0.len());
assert_eq!(1, db.0[0].tasks.len());
assert_eq!(1, db.0[1].tasks.len());
assert_ne!(db, db_after);
}
#[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!(db, db_after);
}
fn new_test_db(files: i32, tasks_per_file: i32) -> DB {
let mut db = DB::new_empty();
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(
format!("{}.yaml", i),
TS::now(),
tasks,
));
}
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");
@ -236,7 +290,7 @@ mod test_taskss {
} }
} }
#[derive(Debug, Clone)] #[derive(Debug, Clone, PartialEq)]
pub struct TasksAndMetadata { pub struct TasksAndMetadata {
tasks: Tasks, tasks: Tasks,
file: String, file: String,
@ -329,7 +383,7 @@ fn file_version(file: String) -> Result<TS, String> {
} }
} }
#[derive(Debug, serde::Serialize, serde::Deserialize, Clone)] #[derive(Debug, serde::Serialize, serde::Deserialize, Clone, PartialEq)]
pub struct Tasks(Vec<Task>); pub struct Tasks(Vec<Task>);
impl Tasks { impl Tasks {