use {
crate::{
Key,
Fields,
Output,
},
clap::{Parser, ValueEnum},
std::path::PathBuf,
termimad::crossterm::tty::IsTty,
};
#[derive(Debug, Default, Parser)]
#[command(author, about, name = "rhit", disable_version_flag = true, version, disable_help_flag = true)]
pub struct Args {
#[arg(long)]
pub help: bool,
#[arg(long)]
pub version: bool,
#[arg(long, default_value="auto", value_name = "color")]
pub color: TriBool,
#[arg(short, long, default_value="hits")]
pub key: Key,
#[arg(short, long, default_value = "1")]
pub length: usize,
#[arg(short, long, default_value = "date,status,ref,path")]
pub fields: Fields,
#[arg(short, long)]
pub changes: bool,
#[arg(short, long)]
pub date: Option<String>,
#[arg(short, long)]
pub ip: Option<String>,
#[arg(short, long)]
pub method: Option<String>,
#[arg(short, long)]
pub path: Option<String>,
#[arg(short, long)]
pub referer: Option<String>,
#[arg(short, long)]
pub status: Option<String>,
#[arg(short, long)]
pub time: Option<String>,
#[arg(short, long)]
pub all: bool,
#[arg(long)]
pub no_name_check: bool,
#[arg(short, long, default_value="tables")]
pub output: Output,
#[arg(long)]
pub silent_load: bool,
pub files: Vec<PathBuf>,
}
#[derive(ValueEnum)]
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum TriBool {
#[default]
Auto,
Yes,
No,
}
impl TriBool {
pub fn unwrap_or_else<F>(self, f: F) -> bool
where
F: FnOnce() -> bool
{
match self {
Self::Auto => f(),
Self::Yes => true,
Self::No => false,
}
}
}
impl Args {
pub fn color(&self) -> bool {
self.color.unwrap_or_else(|| std::io::stdout().is_tty())
}
}