use crate::app::banner::BANNERS;
use crate::app::selection::Selection;
use crate::app::style::Style;
use crate::gpg::key::KeyDetail;
use crate::widget::style::Color;
use clap::Parser;
#[derive(Debug, Default, Parser)]
#[clap(
version,
author = clap::crate_authors!("\n"),
about,
rename_all_env = "screaming-snake",
before_help = format!("\u{2800} {}", BANNERS[2]),
help_template = "\
{before-help}{name} {version}
{author-with-newline}{about-with-newline}
{usage-heading}
{usage}
{all-args}{after-help}
",
)]
pub struct Args {
#[clap(short, long)]
pub armor: bool,
#[clap(long)]
pub splash: bool,
#[clap(
long,
value_name = "path",
env = "GPG_TUI_CONFIG",
value_parser = Args::parse_dir
)]
pub config: Option<String>,
#[clap(
long,
value_name = "dir",
env = "GNUPGHOME",
value_parser = Args::parse_dir
)]
pub homedir: Option<String>,
#[clap(
short,
long,
value_name = "dir",
env,
value_parser = Args::parse_dir
)]
pub outdir: Option<String>,
#[clap(
long,
value_name = "path",
default_value = "{type}_{query}.{ext}",
env,
value_parser = Args::parse_dir
)]
pub outfile: String,
#[clap(short, long, value_name = "key", env)]
pub default_key: Option<String>,
#[clap(short, long, value_name = "ms", default_value = "250", env)]
pub tick_rate: u64,
#[clap(short, long, value_name = "color", default_value = "gray", env)]
pub color: Color,
#[clap(short, long, value_name = "style", default_value = "colored", env)]
pub style: Style,
#[clap(short, long, value_name = "app", default_value = "xplr", env)]
pub file_explorer: String,
#[clap(long, value_name = "level", default_value = "minimum", env)]
pub detail_level: KeyDetail,
#[clap(long, value_name = "path", env)]
pub log_file: Option<String>,
#[clap(long, value_name = "option", env)]
pub select: Option<Selection>,
}
impl Args {
fn parse_dir(dir: &str) -> Result<String, String> {
Ok(shellexpand::tilde(dir).to_string())
}
}
#[cfg(test)]
mod tests {
use super::*;
use clap::CommandFactory;
use std::path::PathBuf;
#[test]
fn test_args() {
Args::command().debug_assert();
}
#[test]
fn test_tilde_expansion() {
let home_dir =
dirs_next::home_dir().expect("cannot retrieve home directory");
let dir = Args::parse_dir("~/").expect("cannot expand tilde");
assert_eq!(home_dir, PathBuf::from(dir));
}
}