Skip to main content

journey/
cli.rs

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    /// Add a note (default behavior)
17    #[arg(short, long)]
18    pub add_note: Option<String>,
19
20    /// List notes for a specific date
21    #[arg(short, long)]
22    pub list: bool,
23
24    /// Edit today's note
25    #[arg(short, long)]
26    pub edit: bool,
27
28    /// Date selector (YYYY-MM-DD format)
29    #[arg(short, long)]
30    pub date: Option<String>,
31
32    /// Relative date selector (days offset, 0 = today, positive = past, negative = future)
33    #[arg(short, long, value_parser = parse_relative_date)]
34    pub relative_date: Option<i64>,
35
36    /// Time selector (HH:MM or HH:MM:SS format)
37    #[arg(short, long)]
38    pub time: Option<String>,
39
40    /// Time format override (12h|24h)
41    #[arg(long)]
42    pub time_format: Option<String>,
43
44    /// Read input from stdin (each line becomes a separate note)
45    #[arg(long)]
46    pub stdin: bool,
47
48    /// Vault name to use (optional if only one vault exists)
49    #[arg(short = 'V', long)]
50    pub vault: Option<String>,
51
52    /// Category for section selection (e.g., 'work' uses section_header_work)
53    #[arg(short = 'c', long)]
54    pub category: Option<String>,
55
56    /// Include table headers when listing notes in table format
57    #[arg(long)]
58    pub header: bool,
59
60    /// Show version information
61    #[arg(short = 'v', long = "version")]
62    pub version: bool,
63
64    /// Note content (for default behavior)
65    #[arg(trailing_var_arg = true)]
66    pub note_content: Vec<String>,
67}
68
69#[derive(Subcommand)]
70pub enum Commands {
71    /// Add a note
72    Add {
73        /// The note content
74        content: String,
75    },
76    /// List notes
77    List,
78    /// Edit notes
79    Edit,
80}
81