1use clap::{Parser, Subcommand};
2
3fn parse_relative_date(s: &str) -> Result<i64, String> {
4 s.parse::<i64>().map_err(|_| format!("Invalid relative date: {}", s))
5}
6
7#[derive(Parser)]
8#[command(name = "journey")]
9#[command(about = "A CLI-based journal application")]
10#[command(disable_version_flag = true)]
11#[command(args_conflicts_with_subcommands = true)]
12pub struct Cli {
13 #[command(subcommand)]
14 pub command: Option<Commands>,
15
16 #[arg(short, long)]
18 pub add_note: Option<String>,
19
20 #[arg(short, long)]
22 pub list: bool,
23
24 #[arg(short, long)]
26 pub edit: bool,
27
28 #[arg(short, long)]
30 pub date: Option<String>,
31
32 #[arg(short, long, value_parser = parse_relative_date)]
34 pub relative_date: Option<i64>,
35
36 #[arg(short, long)]
38 pub time: Option<String>,
39
40 #[arg(long)]
42 pub time_format: Option<String>,
43
44 #[arg(long)]
46 pub stdin: bool,
47
48 #[arg(short = 'V', long)]
50 pub vault: Option<String>,
51
52 #[arg(short = 'c', long)]
54 pub category: Option<String>,
55
56 #[arg(long)]
58 pub header: bool,
59
60 #[arg(short = 'v', long = "version")]
62 pub version: bool,
63
64 #[arg(trailing_var_arg = true)]
66 pub note_content: Vec<String>,
67}
68
69#[derive(Subcommand)]
70pub enum Commands {
71 Add {
73 content: String,
75 },
76 List,
78 Edit,
80}
81