seybio_task_manager/
lib.rs1use 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}