seybio_task_manager/
lib.rs

1use std::time::SystemTime;
2
3#[derive(PartialEq)]
4pub struct Task {
5    title: String,
6    description: String,
7    completed_at: Option<SystemTime>,
8}
9
10
11impl Task {
12    pub fn new(title: String) -> Self {
13        Self {
14            title,
15            description: "".to_string(),
16            completed_at: None,
17        }
18    }
19
20    pub fn complete(&mut self) {
21        match self.completed_at {
22            None => self.completed_at = Some(SystemTime::now()),
23            x => self.completed_at = x
24        }
25    }
26    pub fn uncomplete(&mut self) {
27        self.completed_at = None
28    }
29}
30
31
32pub trait Collection {
33    type Task;
34
35    fn new () -> Self;
36    fn add_task(&mut self, task: Self::Task);
37    fn remove_task(&mut self, task: Self::Task);
38    fn get_all_tasks(&self) -> &Vec<Self::Task>;
39}
40
41pub struct TaskCollection {
42    tasks: Vec<Task>,
43}
44
45impl Collection for TaskCollection {
46    type Task = Task;
47
48    fn new() -> Self {
49        Self {
50            tasks: vec![]
51        }
52    }
53    fn add_task(&mut self, task: Self::Task) {
54        self.tasks.push(task);
55    }
56
57    fn remove_task(&mut self, task: Self::Task){
58        self.tasks.retain(|t| *t != task);
59    }
60
61    fn get_all_tasks(&self) -> &Vec<Self::Task> {
62        &self.tasks
63    }
64}
65
66#[cfg(test)]
67mod tests {
68    use crate::{Collection, Task, TaskCollection};
69
70    #[test]
71    fn it_inits_task() {
72        let expected_title = String::from("new Task");
73        let task = Task::new(expected_title.clone());
74        assert_eq!(task.title, expected_title);
75        assert_eq!(task.description, "".to_string());
76        assert_eq!(task.completed_at, None)
77    }
78
79    #[test]
80    fn it_completes_a_task() {
81        let expected_title = String::from("new Task");
82        let mut task = Task::new(expected_title.clone());
83        task.complete();
84        assert_ne!(task.completed_at, None)
85    }
86
87    #[test]
88    fn it_uncompletes_a_task() {
89        let expected_title = String::from("new Task");
90        let mut task = Task::new(expected_title.clone());
91        task.complete();
92        task.uncomplete();
93        assert_eq!(task.completed_at, None)
94    }
95
96    #[test]
97    fn it_does_not_set_completes_mulitple_times() {
98        let expected_title = String::from("new Task");
99        let mut task = Task::new(expected_title.clone());
100        task.complete();
101        let expected_completed = task.completed_at;
102        task.complete();
103        assert_eq!(task.completed_at, expected_completed)
104    }
105
106    #[test]
107    fn inits_empty_task_collection() {
108        let collection = TaskCollection::new();
109        assert_eq!(collection.tasks.is_empty(), true)
110    }
111}