1use clap::{Args, Parser, Subcommand, ValueEnum};
2use serde::{Deserialize, Serialize};
3
4#[derive(Parser)]
5#[command(version, about, long_about = None)]
6pub struct Arguments {
7 #[command(subcommand)]
8 pub command: Command,
9
10 #[command(flatten)]
11 pub common_args: CommonArguments,
12}
13
14#[derive(Args, Copy, Clone)]
15pub struct CommonArguments {
16 #[arg(long, global = true)]
20 pub no_color: bool,
21}
22
23#[derive(Subcommand)]
24pub enum Command {
25 Display {
27 #[arg(short, long)]
29 date: Option<String>,
30
31 #[command(flatten)]
32 readings: DisplayReadingsArgs,
33
34 #[command(flatten)]
35 formatting: FormattingArgs,
36 },
37 Db {
39 #[command(subcommand)]
40 command: DatabaseCommand,
41 },
42 Config {
45 #[command(subcommand)]
46 command: ConfigCommand,
47 },
48}
49
50#[derive(Subcommand)]
51pub enum DatabaseCommand {
52 Remove {
56 #[arg(trailing_var_arg(true), num_args(1..usize::MAX))]
58 dates: Vec<String>,
59 },
60 Count,
64 Update,
67 #[command(alias = "list")]
71 Show,
72 Purge,
76 Clean {
80 #[arg[short, long]]
81 all: bool,
82 },
83 Refresh,
85 Store {
89 #[arg(trailing_var_arg(true), num_args(1..usize::MAX))]
90 dates: Vec<String>,
91 },
92}
93
94#[derive(Subcommand, Copy, Clone)]
95pub enum ConfigCommand {
96 Init {
98 #[arg(short, long)]
100 force: bool,
101 },
102 Upgrade,
104 Show,
106}
107
108#[derive(Args, Copy, Clone)]
109#[group(required = false, multiple = false)]
110pub struct FormattingArgs {
111 #[arg(short = 'w', long)]
115 pub max_width: Option<u16>,
116
117 #[arg(short, long)]
119 pub original_linebreaks: bool,
120}
121
122#[derive(Args)]
123#[group(required = false, multiple = false)]
124pub struct DisplayReadingsArgs {
125 #[arg(short, long, alias="reading", value_enum, num_args=1..)]
127 pub readings: Option<Vec<ReadingArg>>,
128
129 #[arg(short, long)]
131 pub all: bool,
132
133 #[arg(long)]
135 pub day_only: bool,
136}
137
138#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Serialize, Deserialize)]
139#[serde(rename_all = "lowercase")]
140pub enum ReadingArg {
141 Reading1,
142 Psalm,
143 Reading2,
144 Gospel,
145 Alleluia,
146}
147
148#[cfg(test)]
149mod tests {
150 use super::*;
151 use clap::CommandFactory;
152
153 #[test]
154 fn arguments_works() {
155 Arguments::command().debug_assert();
156 }
157}