use clap::{Args, Parser, Subcommand, ValueHint};
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
#[command(propagate_version = true)]
pub struct Cli {
#[clap(flatten)]
pub verbose: clap_verbosity_flag::Verbosity,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Subcommand)]
pub enum Commands {
#[command(verbatim_doc_comment)]
Crypt {
#[arg(short, long, default_value_t = true, group = "action")]
encrypt: bool,
#[arg(short, long, group = "action")]
decrypt: bool,
#[command(flatten)]
inspect: InspectArg,
#[arg(short = 'u', long)]
set_upstream: Option<String>,
#[arg(short, long, verbatim_doc_comment)]
round: Option<String>,
#[arg(short, long)]
armor: bool,
#[arg(short, long)]
output: Option<String>,
input: Option<String>,
},
#[command(verbatim_doc_comment)]
Rand {
#[arg(short = 'u', long)]
set_upstream: Option<String>,
#[arg(long, default_value_t = true)]
verify: bool,
#[arg(short, long, default_value_t = false, group = "format")]
long: bool,
#[arg(long, default_value_t = false, group = "format")]
json: bool,
beacon: Option<String>,
},
Remote {
#[command(subcommand)]
command: Option<RemoteCommand>,
},
}
#[derive(Args)]
pub struct InspectArg {
#[arg(long, default_value_t = false, group = "action")]
inspect: bool,
#[command(flatten)]
print: PrintArg,
}
#[allow(dead_code)]
impl InspectArg {
pub fn is_true(&self) -> bool {
self.inspect
}
pub fn long(&self) -> bool {
self.print.long
}
pub fn json(&self) -> bool {
self.print.json
}
}
#[derive(Args)]
#[group(multiple = false)]
pub struct PrintArg {
#[arg(short, long, default_value_t = false, group = "format")]
long: bool,
#[arg(long, default_value_t = false, group = "format")]
json: bool,
}
#[derive(Subcommand)]
pub enum RemoteCommand {
Add {
name: String,
#[arg(value_hint = ValueHint::Url)]
url: String,
},
Rename { old: String, new: String },
Remove { name: String },
SetUrl {
name: String,
#[arg(value_hint = ValueHint::Url)]
url: String,
},
Show {
#[arg(short, long, default_value_t = false, group = "format")]
long: bool,
#[arg(long, default_value_t = false, group = "format")]
json: bool,
name: Option<String>,
},
}
#[allow(dead_code)]
pub fn build() -> Cli {
Cli::parse()
}