mj 0.4.3

My Journal - personal tool to capture ideas, work with journals, notes and tasks in your favourite text $EDITOR.
Documentation
use clap::ArgMatches;
use crate::core::*;

#[derive(Debug)]
pub enum TasksArgs {
  EditTasks(String),
  RemoveTasks(String),
  ListAll,
  ListProjects,
  ListTasks(String),
}

pub fn run(vault: &Vault, args: &TasksArgs) -> Result<()> {
  match args {
    TasksArgs::EditTasks(project) => {
      let _saved = tasks::edit(&vault, &project)?;
      Ok(())
    },
    TasksArgs::RemoveTasks(project) => {
      tasks::remove(&vault, &project)
    },
    TasksArgs::ListAll => {
      tasks::list(&vault, true, None)
    },
    TasksArgs::ListProjects => {
      tasks::list(&vault, false, None)
    },
    TasksArgs::ListTasks(project) => {
      tasks::list(&vault, true, Some(project.to_owned()))
    },
  }
}

pub fn match_args(matches: &ArgMatches) -> Option<TasksArgs> {
  if let Some(matches) = matches.subcommand_matches("tasks") {
    if let Some(matches) = matches.subcommand_matches("edit") {
      let project = matches.value_of("PROJECT").unwrap().to_owned();
      return Some(TasksArgs::EditTasks(project))
    }
    if let Some(matches) = matches.subcommand_matches("remove") {
      let project = matches.value_of("PROJECT").unwrap().to_owned();
      return Some(TasksArgs::RemoveTasks(project))
    }
    if let Some(matches) = matches.subcommand_matches("list") {
      let is_projects = matches.is_present("PROJECTS");
      if is_projects {
        return Some(TasksArgs::ListProjects);
      }
      return
        match matches.value_of("PROJECT") {
          Some(project) => Some(TasksArgs::ListTasks(project.to_owned())),
          None => Some(TasksArgs::ListAll),
        };
    }
  }
  None
}