1pub mod commands;
2
3use clap::{Parser, Subcommand};
4
5#[derive(Parser, Debug)]
6#[command(name = "saga", version, about = "Time tracking from the terminal")]
7pub struct Cli {
8 #[command(subcommand)]
9 pub command: Option<Commands>,
10}
11
12#[derive(Subcommand, Debug)]
13pub enum Commands {
14 Tui,
16
17 Start {
19 project: String,
21 #[arg(short, long)]
23 description: Option<String>,
24 #[arg(short, long)]
26 tag: Vec<String>,
27 #[arg(long)]
29 no_billable: bool,
30 },
31
32 Stop {
34 #[arg(short, long)]
36 description: Option<String>,
37 },
38
39 Status,
41
42 Cancel,
44
45 Resume,
47
48 Add {
50 #[arg(short, long)]
52 project: String,
53 #[arg(short, long)]
55 start: String,
56 #[arg(short, long)]
58 end: String,
59 #[arg(short, long)]
61 description: Option<String>,
62 #[arg(short, long)]
64 tag: Vec<String>,
65 },
66
67 Log {
69 #[arg(long)]
71 today: bool,
72 #[arg(long)]
74 week: bool,
75 #[arg(long)]
77 month: bool,
78 #[arg(long)]
80 project: Option<String>,
81 #[arg(long)]
83 client: Option<String>,
84 },
85
86 Report {
88 #[arg(long, default_value = "weekly")]
90 period: String,
91 #[arg(long, default_value = "table")]
93 format: String,
94 #[arg(short, long)]
96 output: Option<String>,
97 },
98
99 Projects {
101 #[command(subcommand)]
102 action: ProjectAction,
103 },
104
105 Clients {
107 #[command(subcommand)]
108 action: ClientAction,
109 },
110
111 Tags {
113 #[command(subcommand)]
114 action: TagAction,
115 },
116
117 Rates {
119 #[command(subcommand)]
120 action: RateAction,
121 },
122
123 Invoice {
125 #[command(subcommand)]
126 action: InvoiceAction,
127 },
128
129 Config {
131 #[command(subcommand)]
132 action: ConfigAction,
133 },
134}
135
136#[derive(Subcommand, Debug)]
137pub enum ProjectAction {
138 List {
140 #[arg(long)]
142 all: bool,
143 },
144 Add {
146 name: String,
148 #[arg(short, long)]
150 client: Option<String>,
151 #[arg(long)]
153 color: Option<String>,
154 #[arg(short, long)]
156 budget: Option<f64>,
157 },
158 Edit {
160 name: String,
162 #[arg(long)]
164 new_name: Option<String>,
165 #[arg(long)]
167 color: Option<String>,
168 #[arg(long)]
170 budget: Option<f64>,
171 },
172 Archive {
174 name: String,
176 },
177 Activate {
179 name: String,
181 },
182}
183
184#[derive(Subcommand, Debug)]
185pub enum ClientAction {
186 List,
188 Add {
190 name: String,
192 #[arg(long)]
194 contact: Option<String>,
195 #[arg(long)]
197 email: Option<String>,
198 },
199 Edit {
201 name: String,
203 #[arg(long)]
205 new_name: Option<String>,
206 #[arg(long)]
208 contact: Option<String>,
209 #[arg(long)]
211 email: Option<String>,
212 },
213 Delete {
215 name: String,
217 },
218}
219
220#[derive(Subcommand, Debug)]
221pub enum TagAction {
222 List,
224 Add {
226 name: String,
228 #[arg(long)]
230 color: Option<String>,
231 },
232 Delete {
234 name: String,
236 },
237}
238
239#[derive(Subcommand, Debug)]
240pub enum RateAction {
241 Set {
243 rate: f64,
245 #[arg(long)]
247 project: Option<String>,
248 #[arg(long)]
250 client: Option<String>,
251 #[arg(long, default_value = "USD")]
253 currency: String,
254 },
255 List,
257}
258
259#[derive(Subcommand, Debug)]
260pub enum InvoiceAction {
261 Generate {
263 #[arg(short, long)]
265 client: String,
266 #[arg(short, long)]
268 from: String,
269 #[arg(short, long)]
271 to: String,
272 #[arg(short, long)]
274 output: Option<String>,
275 },
276 List,
278}
279
280#[derive(Subcommand, Debug)]
281pub enum ConfigAction {
282 Show,
284 Set {
286 key: String,
288 value: String,
290 },
291 Path,
293}