use {
crate::{
cols::Cols,
filter::Filter,
units::Units,
sorting::Sorting,
},
clap::{Parser, ValueEnum},
crossterm::tty::IsTty,
std::path::PathBuf,
};
#[derive(Debug, Parser)]
#[command(author, about, name = "dysk", disable_version_flag = true, version, disable_help_flag = true)]
pub struct Args {
#[arg(long)]
pub help: bool,
#[arg(long)]
pub version: bool,
#[arg(short, long)]
pub all: bool,
#[arg(long, default_value="auto", value_name = "color")]
pub color: TriBool,
#[arg(long, default_value="auto", value_name = "choice")]
pub remote_stats: TriBool,
#[arg(long)]
pub list_cols: bool,
#[arg(short, long, default_value = "fs+type+disk+used+use+free+size+mp", value_name = "columns")]
pub cols: Cols,
#[arg(short, long, value_name = "expr")]
pub filter: Option<Filter>,
#[arg(short, long, default_value = "size", value_name = "sort")]
pub sort: Sorting,
#[arg(short, long, default_value = "SI", value_name = "unit")]
pub units: Units,
#[arg(short, long)]
pub json: bool,
#[arg(long)]
pub csv: bool,
#[arg(long, default_value = ",", value_name = "sep")]
pub csv_separator: char,
pub path: Option<PathBuf>,
}
#[derive(ValueEnum)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TriBool {
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())
}
}