1use crate::{AddArgs, EditArgs, Error, GetArgs, RemoveArgs, Task};
2use std::{
3 fs,
4 path::{Path, PathBuf},
5};
6
7pub struct TaskManager {
8 path: PathBuf,
9 tasks: Vec<Task>,
10}
11
12impl TaskManager {
13 fn save(&self) {
14 let contents = serde_json::to_string(&self.tasks).unwrap();
15 fs::write(&self.path, contents).unwrap();
16 }
17
18 pub fn load(path: impl AsRef<Path>) -> Self {
19 let tasks = fs::read_to_string(&path).unwrap_or("[]".to_string());
20 let tasks = serde_json::from_str(&tasks).unwrap();
21 Self {
22 tasks,
23 path: path.as_ref().to_path_buf(),
24 }
25 }
26
27 pub fn get(&self, args: GetArgs) -> Vec<&Task> {
28 if let Some(status) = args.status {
29 let tasks = self.tasks.iter().filter(|task| task.status == status);
30 tasks.collect()
31 } else {
32 self.tasks.iter().collect()
33 }
34 }
35
36 pub fn add(&mut self, args: AddArgs) -> &Task {
37 let id = self.tasks.iter().map(|task| task.id).max().unwrap_or(0) + 1;
38 let task = Task {
39 id,
40 content: args.content,
41 status: args.status,
42 };
43 self.tasks.push(task);
44 self.save();
45 self.tasks.last().unwrap()
46 }
47
48 pub fn edit(&mut self, args: EditArgs) -> Result<&Task, Error> {
49 if let Some(index) = self.tasks.iter().position(|task| task.id == args.id) {
50 let task = self.tasks.get_mut(index).unwrap();
51 if let Some(content) = args.content {
52 task.content = content;
53 }
54 if let Some(status) = args.status {
55 task.status = status;
56 }
57 self.save();
58 Ok(self.tasks.get(index).unwrap())
59 } else {
60 Err(Error::TaskNotFound)
61 }
62 }
63
64 pub fn remove(&mut self, args: RemoveArgs) -> Result<(), Error> {
65 if let Some(index) = self.tasks.iter().position(|task| task.id == args.id) {
66 self.tasks.remove(index);
67 self.save();
68 Ok(())
69 } else {
70 Err(Error::TaskNotFound)
71 }
72 }
73}