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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
use std::path::PathBuf;
use clap::{Parser, Subcommand};
use crate::{
interface::{input::Input, project::ProjectName},
task,
};
#[derive(Parser, Debug)]
#[command(author, version, about, long_about, verbatim_doc_comment)]
/// This is the core interface to the system-integrated task management
///
/// `tskm` effectively combines multiple applications together:
/// - `taskwarrior` projects are raised connected to `firefox` profiles, making it possible to “open”
/// a project.
/// - Every `taskwarrior` project has a determined `neorg` path, so that extra information for a
/// `project` can be stored in this `norg` file.
/// - `tskm` can track inputs for you. These are URLs with optional tags which you can that
/// “review” to open tasks based on them.
pub struct CliArgs {
#[command(subcommand)]
pub command: Command,
}
#[derive(Subcommand, Debug)]
pub enum Command {
/// Interact with projects.
Projects {
#[command(subcommand)]
command: ProjectCommand,
},
/// Manage the input queue.
Inputs {
#[command(subcommand)]
command: InputCommand,
},
/// Access the associated `neorg` workspace for the project/task.
Neorg {
#[command(subcommand)]
command: NeorgCommand,
},
/// Interface with the Firefox profile of each project.
Open {
#[command(subcommand)]
command: OpenCommand,
},
}
#[derive(Subcommand, Debug)]
pub enum ProjectCommand {
/// Lists all available projects.
List,
/// Allows you to quickly add projects.
Add {
/// The name of the new project.
#[arg(value_parser = ProjectName::try_from_project)]
new_project_name: ProjectName,
},
}
#[derive(Subcommand, Debug, Clone, Copy)]
pub enum NeorgCommand {
/// Open the `neorg` project associated with id of the task.
Task { id: task::Id },
}
#[derive(Subcommand, Debug)]
pub enum OpenCommand {
/// Open each project's Firefox profile consecutively, that was opened since the last review.
///
/// This allows you to remove stale opened tabs and to commit open tabs to the `inputs`.
Review,
/// Opens Firefox with either the supplied project or the currently active project profile.
Project {
/// The project to open.
#[arg(value_parser = task::Project::from_project_string)]
project: Option<task::Project>,
},
/// Open a selected project in it's Firefox profile.
///
/// This will use rofi's dmenu mode to select one project from the list of all registered
/// projects.
Select,
/// List all open tabs in the project.
ListTabs {
/// The project to open.
#[arg(value_parser = task::Project::from_project_string)]
project: Option<task::Project>,
}
}
#[derive(Subcommand, Debug)]
pub enum InputCommand {
/// Add URLs as inputs to be categorized.
Add { inputs: Vec<Input> },
/// Remove URLs
Remove { inputs: Vec<Input> },
/// Add all URLs in the file as inputs to be categorized.
///
/// This expects each line to contain one URL.
File { file: PathBuf },
/// Like 'review', but for the inputs that have previously been added.
/// It takes a project in which to open the URLs.
Review {
/// Opens all the URLs in this project.
#[arg(value_parser = task::Project::from_project_string)]
project: task::Project,
},
/// List all the previously added inputs.
List,
}
|