tasks_rs/
manager.rs

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}