tatou 0.1.1

Tatou is a simple TUI application to manage and organize tasks.
#[derive(Debug, Default)]
pub struct Project {
  pub id: i64,
  pub title: String,
  pub tasks: Vec<Task>,
}

impl Project {
  pub fn new(id: i64, title: String, tasks: Vec<Task>) -> Self {
    Self { id, title, tasks }
  }

  pub fn rename(&mut self, new_title: String) {
    self.title = new_title;
  }

  pub fn populate_tasks(&mut self, tasks: Vec<Task>) {
    self.tasks = tasks;
  }

  pub fn toggle_task_done(&mut self, task_index: usize) -> Option<(i64, bool)> {
    if let Some(task) = self.tasks.get_mut(task_index) {
      task.is_done = !task.is_done;
      return Some((task.id, task.is_done));
    }
    None
  }

  pub fn add_task(&mut self, task: Task) {
    self.tasks.push(task);
  }

  pub fn remove_task(&mut self, task_index: usize) -> i64 {
    let task = self.tasks.remove(task_index);
    task.id
  }

  pub fn rename_task(&mut self, new_title: String, task_index: usize) -> Option<i64> {
    if let Some(task) = self.tasks.get_mut(task_index) {
      task.title = new_title;
      return Some(task.id);
    }
    None
  }

  pub fn get_task_title(&self, task_index: usize) -> Option<String> {
    if let Some(task) = self.tasks.get(task_index) {
      return Some(task.title.clone());
    }
    None
  }
}

#[derive(Debug, Default)]
pub struct Task {
  id: i64,
  pub title: String,
  pub is_done: bool,
}

impl Task {
  pub fn new(id: i64, title: String, is_done: bool) -> Self {
    Self { id, title, is_done }
  }
}