use std::fmt;
use clap::Parser;
#[derive(clap::Args, Debug, Clone)]
#[command(disable_version_flag = true)]
pub struct Delete {}
#[derive(clap::Args, Debug, Clone)]
#[command(disable_version_flag = true)]
pub struct HunterOptions {
pub source_dir: String,
#[clap(short, long, default_value_t = 10)]
pub max_depth: usize,
#[clap(long, default_value_t = false)]
pub no_max_depth: bool,
#[clap(short, long, default_value_t = false)]
pub checksum: bool,
#[clap(short, long)]
pub extension: Option<String>,
#[clap(short, long, value_enum, default_value_t = SortBy::FileType)]
pub sort_by: SortBy,
#[clap(short, long)]
pub order_by: Option<OrderBy>,
#[clap(short = 'j', long)]
pub max: Option<String>,
#[clap(short = 'l', long)]
pub min: Option<String>,
#[clap(short = 'u', long, requires = "output_file")]
pub output_style: Option<OutputStyle>,
#[clap(short = 'f', long, requires = "output_style")]
pub output_file: Option<String>,
}
#[derive(clap::Args, Debug, Clone)]
#[command(disable_version_flag = true)]
pub struct DeleteOptions {
#[clap(short, long)]
pub input_file: String,
#[clap(long, default_value_t = false)]
pub dry_run: bool,
}
#[derive(clap::ValueEnum, Clone, Copy, Debug)]
pub enum SortBy {
FileType,
FileSize,
Both,
}
#[derive(clap::ValueEnum, Clone, Copy, Debug)]
pub enum OrderBy {
Asc,
Desc,
}
#[derive(clap::ValueEnum, Clone, Copy, Debug)]
pub enum OutputStyle {
Default,
JSON,
}
#[derive(clap::Subcommand, Debug, Clone)]
pub enum Command {
Hunt(HunterOptions),
Delete(DeleteOptions),
}
#[derive(Parser, Clone)]
#[command(author="@github.com/omkarium", version, about, long_about = None)]
pub struct Args {
#[command(subcommand)]
pub command: Command,
#[clap(short, long, default_value_t = 8)]
pub threads: u8,
#[clap(short, long, default_value_t = false)]
pub verbose: bool,
}
impl fmt::Display for OrderBy {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
OrderBy::Asc => write!(f, "{}", "Asc"),
OrderBy::Desc => write!(f, "{}", "Desc"),
}
}
}
impl fmt::Display for OutputStyle {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
OutputStyle::Default => write!(f, "{}", "Default"),
OutputStyle::JSON => write!(f, "{}", "JSON"),
}
}
}