use clap::{Args, Parser, Subcommand, ValueEnum};
#[derive(Parser)]
#[command(version, about, author)]
pub struct Cli {
#[command(subcommand)]
pub command: SubCommands,
}
#[derive(Args)]
#[command(flatten_help = true)]
pub struct RegexArgs {
pub expression: String,
pub replacement: String,
#[command(flatten)]
pub common: CommonArgs,
#[command(flatten)]
pub replace: ReplaceArgs,
#[command(flatten)]
pub path: PathArgs,
}
#[derive(Args)]
pub struct CommonArgs {
#[arg(short = 'n', long, conflicts_with = "force")]
pub dry_run: bool,
#[arg(short, long)]
pub force: bool,
#[arg(short, long)]
pub backup: bool,
#[arg(short, long)]
pub silent: bool,
#[arg(value_enum, long, default_value_t = Color::Auto)]
pub color: Color,
#[arg(long, conflicts_with = "no_dump")]
pub dump: bool,
#[arg(long, conflicts_with = "no_dump", default_value = "rnr-")]
pub dump_prefix: String,
#[arg(long)]
pub no_dump: bool,
}
#[derive(Args)]
pub struct PathArgs {
#[arg(value_name = "PATH(S)", required = true)]
pub paths: Vec<String>,
#[arg(short = 'D', long)]
pub include_dirs: bool,
#[arg(short, long)]
pub recursive: bool,
#[arg(short = 'd', long, requires = "recursive", value_name = "LEVEL")]
pub max_depth: Option<usize>,
#[arg(short = 'x', long, requires = "recursive")]
pub hidden: bool,
}
#[derive(Args)]
pub struct ReplaceArgs {
#[arg(short = 'l', long, value_name = "LIMIT")]
pub replace_limit: Option<usize>,
#[arg(value_enum, short = 't', long)]
pub replace_transform: Option<ReplaceTransform>,
}
#[derive(Subcommand)]
pub enum SubCommands {
#[command(arg_required_else_help = true)]
Regex(RegexArgs),
#[command(arg_required_else_help = true)]
FromFile {
#[command(flatten)]
common: CommonArgs,
#[arg(value_name = "DUMPFILE")]
dumpfile: String,
#[arg(short, long)]
undo: bool,
},
#[command(arg_required_else_help = true)]
ToASCII {
#[command(flatten)]
common: CommonArgs,
#[command(flatten)]
path: PathArgs,
},
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
pub enum Color {
Always,
Never,
Auto,
}
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
pub enum ReplaceTransform {
Upper,
Lower,
Ascii,
}
#[cfg(test)]
mod test {
use crate::cli::Cli;
use clap::CommandFactory;
#[test]
fn verify_cli() {
Cli::command().debug_assert();
}
}