diff options
Diffstat (limited to 'src/options.rs')
-rw-r--r-- | src/options.rs | 79 |
1 files changed, 50 insertions, 29 deletions
diff --git a/src/options.rs b/src/options.rs index a7d7618..d62c199 100644 --- a/src/options.rs +++ b/src/options.rs @@ -1,20 +1,41 @@ +use clap::Clap; use dua::ByteFormat as LibraryByteFormat; use std::path::PathBuf; -use structopt::{clap::arg_enum, StructOpt}; +use std::str::FromStr; -arg_enum! { - #[derive(PartialEq, Debug)] - pub enum ByteFormat { - Metric, - Binary, - Bytes, - GB, - GiB, - MB, - MiB +#[derive(PartialEq, Debug)] +pub enum ByteFormat { + Metric, + Binary, + Bytes, + GB, + GiB, + MB, + MiB, +} + +impl FromStr for ByteFormat { + type Err = String; + + fn from_str(s: &str) -> Result<Self, Self::Err> { + Ok(match s { + "metric" | "Metric" => ByteFormat::Metric, + "binary" | "Binary" => ByteFormat::Binary, + "bytes" | "Bytes" => ByteFormat::Bytes, + "GB" | "Gb" | "gb" => ByteFormat::GB, + "GiB" | "gib" => ByteFormat::GiB, + "MB" | "Mb" | "mb" => ByteFormat::MB, + "MiB" | "mib" => ByteFormat::MiB, + _ => return Err(format!("Invalid byte format: {:?}", s)), + }) } } +impl ByteFormat { + const VARIANTS: &'static [&'static str] = + &["metric", "binary", "bytes", "MB", "MiB", "GB", "GiB"]; +} + impl From<ByteFormat> for LibraryByteFormat { fn from(input: ByteFormat) -> Self { match input { @@ -29,16 +50,16 @@ impl From<ByteFormat> for LibraryByteFormat { } } -#[derive(Debug, StructOpt)] -#[structopt(name = "dua", about = "A tool to learn about disk usage, fast!")] -#[structopt(setting = structopt::clap::AppSettings::ColoredHelp)] +#[derive(Debug, Clap)] +#[clap(name = "dua", about = "A tool to learn about disk usage, fast!")] +#[clap(setting = clap::AppSettings::ColoredHelp)] pub struct Args { - #[structopt(subcommand)] + #[clap(subcommand)] pub command: Option<Command>, /// The amount of threads to use. Defaults to the amount of logical processors. /// Set to 1 to use only a single thread. - #[structopt(short = "t", long = "threads")] + #[clap(short = 't', long = "threads")] pub threads: Option<usize>, /// The format with which to print byte counts. @@ -49,51 +70,51 @@ pub struct Args { /// GiB - only gibibytes /// MB - only megabytes /// MiB - only mebibytes - #[structopt(short = "f", long, case_insensitive = true, possible_values(&ByteFormat::variants()))] + #[clap(short = 'f', long, case_insensitive = true, possible_values(&ByteFormat::VARIANTS))] pub format: Option<ByteFormat>, /// Display apparent size instead of disk usage. - #[structopt(short = "A", long)] + #[clap(short = 'A', long)] pub apparent_size: bool, /// Count hard-linked files each time they are seen - #[structopt(short = "l", long)] + #[clap(short = 'l', long)] pub count_hard_links: bool, /// If set, we will not cross filesystems or traverse mount points - #[structopt(short = "x", long)] + #[clap(short = 'x', long)] pub stay_on_filesystem: bool, /// One or more input files or directories. If unset, we will use all entries in the current working directory. - #[structopt(parse(from_os_str))] + #[clap(parse(from_os_str))] pub input: Vec<PathBuf>, } -#[derive(Debug, StructOpt)] +#[derive(Debug, Clap)] pub enum Command { /// Launch the terminal user interface #[cfg(any(feature = "tui-unix", feature = "tui-crossplatform"))] - #[structopt(name = "interactive", visible_alias = "i")] + #[clap(name = "interactive", visible_alias = "i")] Interactive { /// One or more input files or directories. If unset, we will use all entries in the current working directory. - #[structopt(parse(from_os_str))] + #[clap(parse(from_os_str))] input: Vec<PathBuf>, }, /// Aggregrate the consumed space of one or more directories or files - #[structopt(name = "aggregate", visible_alias = "a")] + #[clap(name = "aggregate", visible_alias = "a")] Aggregate { /// If set, print additional statistics about the file traversal to stderr - #[structopt(long = "stats")] + #[clap(long = "stats")] statistics: bool, /// If set, paths will be printed in their order of occurrence on the command-line. /// Otherwise they are sorted by their size in bytes, ascending. - #[structopt(long)] + #[clap(long)] no_sort: bool, /// If set, no total column will be computed for multiple inputs - #[structopt(long)] + #[clap(long)] no_total: bool, /// One or more input files or directories. If unset, we will use all entries in the current working directory. - #[structopt(parse(from_os_str))] + #[clap(parse(from_os_str))] input: Vec<PathBuf>, }, } |