seybio-task-manager 0.1.1

This lib provides a struc to manage Tasks (ie. for Todo apps)
Documentation
use std::time::SystemTime;

#[derive(PartialEq)]
pub struct Task {
    title: String,
    description: String,
    completed_at: Option<SystemTime>,
}


impl Task {
    pub fn new(title: String) -> Self {
        Self {
            title,
            description: "".to_string(),
            completed_at: None,
        }
    }

    pub fn complete(&mut self) {
        match self.completed_at {
            None => self.completed_at = Some(SystemTime::now()),
            x => self.completed_at = x
        }
    }
    pub fn uncomplete(&mut self) {
        self.completed_at = None
    }
}


pub trait Collection {
    type Task;

    fn new () -> Self;
    fn add_task(&mut self, task: Self::Task);
    fn remove_task(&mut self, task: Self::Task);
    fn get_all_tasks(&self) -> &Vec<Self::Task>;
}

pub struct TaskCollection {
    tasks: Vec<Task>,
}

impl Collection for TaskCollection {
    type Task = Task;

    fn new() -> Self {
        Self {
            tasks: vec![]
        }
    }
    fn add_task(&mut self, task: Self::Task) {
        self.tasks.push(task);
    }

    fn remove_task(&mut self, task: Self::Task){
        self.tasks.retain(|t| *t != task);
    }

    fn get_all_tasks(&self) -> &Vec<Self::Task> {
        &self.tasks
    }
}

#[cfg(test)]
mod tests {
    use crate::{Collection, Task, TaskCollection};

    #[test]
    fn it_inits_task() {
        let expected_title = String::from("new Task");
        let task = Task::new(expected_title.clone());
        assert_eq!(task.title, expected_title);
        assert_eq!(task.description, "".to_string());
        assert_eq!(task.completed_at, None)
    }

    #[test]
    fn it_completes_a_task() {
        let expected_title = String::from("new Task");
        let mut task = Task::new(expected_title.clone());
        task.complete();
        assert_ne!(task.completed_at, None)
    }

    #[test]
    fn it_uncompletes_a_task() {
        let expected_title = String::from("new Task");
        let mut task = Task::new(expected_title.clone());
        task.complete();
        task.uncomplete();
        assert_eq!(task.completed_at, None)
    }

    #[test]
    fn it_does_not_set_completes_mulitple_times() {
        let expected_title = String::from("new Task");
        let mut task = Task::new(expected_title.clone());
        task.complete();
        let expected_completed = task.completed_at;
        task.complete();
        assert_eq!(task.completed_at, expected_completed)
    }

    #[test]
    fn inits_empty_task_collection() {
        let collection = TaskCollection::new();
        assert_eq!(collection.tasks.is_empty(), true)
    }
}