1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
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
}