From 81d52e6e3a6aa5220eb19c72fbc4f9ad75fda7f2 Mon Sep 17 00:00:00 2001 From: Jedsek Date: Mon, 22 Aug 2022 19:31:12 +0800 Subject: [PATCH] Support for completions --- Cargo.lock | 11 ++- Cargo.toml | 8 ++- build.rs | 18 +++++ completions/_dust | 65 ++++++++++++++++++ completions/_dust.ps1 | 67 ++++++++++++++++++ completions/dust.bash | 86 +++++++++++++++++++++++ completions/dust.elv | 61 +++++++++++++++++ completions/dust.fish | 19 ++++++ src/cli.rs | 128 +++++++++++++++++++++++++++++++++++ src/display.rs | 14 +--- src/main.rs | 154 ++++-------------------------------------- 11 files changed, 476 insertions(+), 155 deletions(-) create mode 100644 build.rs create mode 100644 completions/_dust create mode 100644 completions/_dust.ps1 create mode 100644 completions/dust.bash create mode 100644 completions/dust.elv create mode 100644 completions/dust.fish create mode 100644 src/cli.rs diff --git a/Cargo.lock b/Cargo.lock index c0d69eb..4236a18 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -84,12 +84,20 @@ dependencies = [ "bitflags", "clap_lex", "indexmap", - "once_cell", "strsim", "termcolor", "textwrap", ] +[[package]] +name = "clap_complete" +version = "3.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4179da71abd56c26b54dd0c248cc081c1f43b0a1a7e8448e28e57a29baa993d" +dependencies = [ + "clap", +] + [[package]] name = "clap_lex" version = "0.2.4" @@ -194,6 +202,7 @@ dependencies = [ "ansi_term", "assert_cmd", "clap", + "clap_complete", "config-file", "directories", "lscolors", diff --git a/Cargo.toml b/Cargo.toml index f22a67d..cf717c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ name = "du-dust" description = "A more intuitive version of du" version = "0.8.1" authors = ["bootandy ", "nebkor "] -edition = "2018" +edition = "2021" readme = "README.md" documentation = "https://github.com/bootandy/dust" @@ -28,7 +28,7 @@ strip = true [dependencies] ansi_term = "0.12" -clap = { version = "=3", features = ["cargo"] } +clap = "3.2.17" lscolors = "0.7" terminal_size = "0.1" unicode-width = "0.1" @@ -47,6 +47,10 @@ winapi-util = "0.1" assert_cmd = "1" tempfile = "=3" +[build-dependencies] +clap = "3.2.17" +clap_complete = "3.2.4" + [[test]] name = "integration" path = "tests/tests.rs" diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..1755579 --- /dev/null +++ b/build.rs @@ -0,0 +1,18 @@ +use clap_complete::{generate_to, shells::*}; +use std::io::Error; + +include!("src/cli.rs"); + +fn main() -> Result<(), Error> { + let outdir = "completions"; + let app_name = "dust"; + let mut cmd = build_cli(); + + generate_to(Bash, &mut cmd, app_name, outdir)?; + generate_to(Zsh, &mut cmd, app_name, outdir)?; + generate_to(Fish, &mut cmd, app_name, outdir)?; + generate_to(PowerShell, &mut cmd, app_name, outdir)?; + generate_to(Elvish, &mut cmd, app_name, outdir)?; + + Ok(()) +} diff --git a/completions/_dust b/completions/_dust new file mode 100644 index 0000000..b9d50af --- /dev/null +++ b/completions/_dust @@ -0,0 +1,65 @@ +#compdef dust + +autoload -U is-at-least + +_dust() { + typeset -A opt_args + typeset -a _arguments_options + local ret=1 + + if is-at-least 5.2; then + _arguments_options=(-s -S -C) + else + _arguments_options=(-s -C) + fi + + local context curcontext="$curcontext" state line + _arguments "${_arguments_options[@]}" \ +'-d+[Depth to show]: : ' \ +'--depth=[Depth to show]: : ' \ +'-n+[Number of lines of output to show. (Default is terminal_height - 10)]: : ' \ +'--number-of-lines=[Number of lines of output to show. (Default is terminal_height - 10)]: : ' \ +'*-X+[Exclude any file or directory with this name]: : ' \ +'*--ignore-directory=[Exclude any file or directory with this name]: : ' \ +'(-e --filter -t --file_types)*-v+[Exclude filepaths matching this regex. To ignore png files type: -v "\\.png$" ]: : ' \ +'(-e --filter -t --file_types)*--invert-filter=[Exclude filepaths matching this regex. To ignore png files type: -v "\\.png$" ]: : ' \ +'(-t --file_types)*-e+[Only include filepaths matching this regex. For png files type: -e "\\.png$" ]: : ' \ +'(-t --file_types)*--filter=[Only include filepaths matching this regex. For png files type: -e "\\.png$" ]: : ' \ +'-w+[Specify width of output overriding the auto detection of terminal width]: : ' \ +'--terminal_width=[Specify width of output overriding the auto detection of terminal width]: : ' \ +'-h[Print help information]' \ +'--help[Print help information]' \ +'-V[Print version information]' \ +'--version[Print version information]' \ +'-p[Subdirectories will not have their path shortened]' \ +'--full-paths[Subdirectories will not have their path shortened]' \ +'-x[Only count the files and directories on the same filesystem as the supplied directory]' \ +'--limit-filesystem[Only count the files and directories on the same filesystem as the supplied directory]' \ +'-s[Use file length instead of blocks]' \ +'--apparent-size[Use file length instead of blocks]' \ +'-r[Print tree upside down (biggest highest)]' \ +'--reverse[Print tree upside down (biggest highest)]' \ +'-c[No colors will be printed (Useful for commands like: watch)]' \ +'--no-colors[No colors will be printed (Useful for commands like: watch)]' \ +'-b[No percent bars or percentages will be displayed]' \ +'--no-percent-bars[No percent bars or percentages will be displayed]' \ +'--skip-total[No total row will be displayed]' \ +'-f[Directory '\''size'\'' is number of child files/dirs not disk size]' \ +'--filecount[Directory '\''size'\'' is number of child files/dirs not disk size]' \ +'-i[Do not display hidden files]' \ +'--ignore_hidden[Do not display hidden files]' \ +'(-d --depth)-t[show only these file types]' \ +'(-d --depth)--file_types[show only these file types]' \ +'-H[print sizes in powers of 1000 (e.g., 1.1G)]' \ +'--si[print sizes in powers of 1000 (e.g., 1.1G)]' \ +'*::inputs:' \ +&& ret=0 +} + +(( $+functions[_dust_commands] )) || +_dust_commands() { + local commands; commands=() + _describe -t commands 'dust commands' commands "$@" +} + +_dust "$@" diff --git a/completions/_dust.ps1 b/completions/_dust.ps1 new file mode 100644 index 0000000..e08646e --- /dev/null +++ b/completions/_dust.ps1 @@ -0,0 +1,67 @@ + +using namespace System.Management.Automation +using namespace System.Management.Automation.Language + +Register-ArgumentCompleter -Native -CommandName 'dust' -ScriptBlock { + param($wordToComplete, $commandAst, $cursorPosition) + + $commandElements = $commandAst.CommandElements + $command = @( + 'dust' + for ($i = 1; $i -lt $commandElements.Count; $i++) { + $element = $commandElements[$i] + if ($element -isnot [StringConstantExpressionAst] -or + $element.StringConstantType -ne [StringConstantType]::BareWord -or + $element.Value.StartsWith('-') -or + $element.Value -eq $wordToComplete) { + break + } + $element.Value + }) -join ';' + + $completions = @(switch ($command) { + 'dust' { + [CompletionResult]::new('-d', 'd', [CompletionResultType]::ParameterName, 'Depth to show') + [CompletionResult]::new('--depth', 'depth', [CompletionResultType]::ParameterName, 'Depth to show') + [CompletionResult]::new('-n', 'n', [CompletionResultType]::ParameterName, 'Number of lines of output to show. (Default is terminal_height - 10)') + [CompletionResult]::new('--number-of-lines', 'number-of-lines', [CompletionResultType]::ParameterName, 'Number of lines of output to show. (Default is terminal_height - 10)') + [CompletionResult]::new('-X', 'X', [CompletionResultType]::ParameterName, 'Exclude any file or directory with this name') + [CompletionResult]::new('--ignore-directory', 'ignore-directory', [CompletionResultType]::ParameterName, 'Exclude any file or directory with this name') + [CompletionResult]::new('-v', 'v', [CompletionResultType]::ParameterName, 'Exclude filepaths matching this regex. To ignore png files type: -v "\.png$" ') + [CompletionResult]::new('--invert-filter', 'invert-filter', [CompletionResultType]::ParameterName, 'Exclude filepaths matching this regex. To ignore png files type: -v "\.png$" ') + [CompletionResult]::new('-e', 'e', [CompletionResultType]::ParameterName, 'Only include filepaths matching this regex. For png files type: -e "\.png$" ') + [CompletionResult]::new('--filter', 'filter', [CompletionResultType]::ParameterName, 'Only include filepaths matching this regex. For png files type: -e "\.png$" ') + [CompletionResult]::new('-w', 'w', [CompletionResultType]::ParameterName, 'Specify width of output overriding the auto detection of terminal width') + [CompletionResult]::new('--terminal_width', 'terminal_width', [CompletionResultType]::ParameterName, 'Specify width of output overriding the auto detection of terminal width') + [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information') + [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information') + [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Print version information') + [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version information') + [CompletionResult]::new('-p', 'p', [CompletionResultType]::ParameterName, 'Subdirectories will not have their path shortened') + [CompletionResult]::new('--full-paths', 'full-paths', [CompletionResultType]::ParameterName, 'Subdirectories will not have their path shortened') + [CompletionResult]::new('-x', 'x', [CompletionResultType]::ParameterName, 'Only count the files and directories on the same filesystem as the supplied directory') + [CompletionResult]::new('--limit-filesystem', 'limit-filesystem', [CompletionResultType]::ParameterName, 'Only count the files and directories on the same filesystem as the supplied directory') + [CompletionResult]::new('-s', 's', [CompletionResultType]::ParameterName, 'Use file length instead of blocks') + [CompletionResult]::new('--apparent-size', 'apparent-size', [CompletionResultType]::ParameterName, 'Use file length instead of blocks') + [CompletionResult]::new('-r', 'r', [CompletionResultType]::ParameterName, 'Print tree upside down (biggest highest)') + [CompletionResult]::new('--reverse', 'reverse', [CompletionResultType]::ParameterName, 'Print tree upside down (biggest highest)') + [CompletionResult]::new('-c', 'c', [CompletionResultType]::ParameterName, 'No colors will be printed (Useful for commands like: watch)') + [CompletionResult]::new('--no-colors', 'no-colors', [CompletionResultType]::ParameterName, 'No colors will be printed (Useful for commands like: watch)') + [CompletionResult]::new('-b', 'b', [CompletionResultType]::ParameterName, 'No percent bars or percentages will be displayed') + [CompletionResult]::new('--no-percent-bars', 'no-percent-bars', [CompletionResultType]::ParameterName, 'No percent bars or percentages will be displayed') + [CompletionResult]::new('--skip-total', 'skip-total', [CompletionResultType]::ParameterName, 'No total row will be displayed') + [CompletionResult]::new('-f', 'f', [CompletionResultType]::ParameterName, 'Directory ''size'' is number of child files/dirs not disk size') + [CompletionResult]::new('--filecount', 'filecount', [CompletionResultType]::ParameterName, 'Directory ''size'' is number of child files/dirs not disk size') + [CompletionResult]::new('-i', 'i', [CompletionResultType]::ParameterName, 'Do not display hidden files') + [CompletionResult]::new('--ignore_hidden', 'ignore_hidden', [CompletionResultType]::ParameterName, 'Do not display hidden files') + [CompletionResult]::new('-t', 't', [CompletionResultType]::ParameterName, 'show only these file types') + [CompletionResult]::new('--file_types', 'file_types', [CompletionResultType]::ParameterName, 'show only these file types') + [CompletionResult]::new('-H', 'H', [CompletionResultType]::ParameterName, 'print sizes in powers of 1000 (e.g., 1.1G)') + [CompletionResult]::new('--si', 'si', [CompletionResultType]::ParameterName, 'print sizes in powers of 1000 (e.g., 1.1G)') + break + } + }) + + $completions.Where{ $_.CompletionText -like "$wordToComplete*" } | + Sort-Object -Property ListItemText +} diff --git a/completions/dust.bash b/completions/dust.bash new file mode 100644 index 0000000..aabf8ec --- /dev/null +++ b/completions/dust.bash @@ -0,0 +1,86 @@ +_dust() { + local i cur prev opts cmds + COMPREPLY=() + cur="${COMP_WORDS[COMP_CWORD]}" + prev="${COMP_WORDS[COMP_CWORD-1]}" + cmd="" + opts="" + + for i in ${COMP_WORDS[@]} + do + case "${i}" in + "$1") + cmd="dust" + ;; + *) + ;; + esac + done + + case "${cmd}" in + dust) + opts="-h -V -d -n -p -X -x -s -r -c -b -f -i -v -e -t -w -H --help --version --depth --number-of-lines --full-paths --ignore-directory --limit-filesystem --apparent-size --reverse --no-colors --no-percent-bars --skip-total --filecount --ignore_hidden --invert-filter --filter --file_types --terminal_width --si ..." + if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + fi + case "${prev}" in + --depth) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -d) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --number-of-lines) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -n) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --ignore-directory) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -X) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --invert-filter) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -v) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --filter) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -e) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + --terminal_width) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -w) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + *) + COMPREPLY=() + ;; + esac + COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) + return 0 + ;; + esac +} + +complete -F _dust -o bashdefault -o default dust diff --git a/completions/dust.elv b/completions/dust.elv new file mode 100644 index 0000000..4ef4ede --- /dev/null +++ b/completions/dust.elv @@ -0,0 +1,61 @@ + +use builtin; +use str; + +set edit:completion:arg-completer[dust] = {|@words| + fn spaces {|n| + builtin:repeat $n ' ' | str:join '' + } + fn cand {|text desc| + edit:complex-candidate $text &display=$text' '(spaces (- 14 (wcswidth $text)))$desc + } + var command = 'dust' + for word $words[1..-1] { + if (str:has-prefix $word '-') { + break + } + set command = $command';'$word + } + var completions = [ + &'dust'= { + cand -d 'Depth to show' + cand --depth 'Depth to show' + cand -n 'Number of lines of output to show. (Default is terminal_height - 10)' + cand --number-of-lines 'Number of lines of output to show. (Default is terminal_height - 10)' + cand -X 'Exclude any file or directory with this name' + cand --ignore-directory 'Exclude any file or directory with this name' + cand -v 'Exclude filepaths matching this regex. To ignore png files type: -v "\.png$" ' + cand --invert-filter 'Exclude filepaths matching this regex. To ignore png files type: -v "\.png$" ' + cand -e 'Only include filepaths matching this regex. For png files type: -e "\.png$" ' + cand --filter 'Only include filepaths matching this regex. For png files type: -e "\.png$" ' + cand -w 'Specify width of output overriding the auto detection of terminal width' + cand --terminal_width 'Specify width of output overriding the auto detection of terminal width' + cand -h 'Print help information' + cand --help 'Print help information' + cand -V 'Print version information' + cand --version 'Print version information' + cand -p 'Subdirectories will not have their path shortened' + cand --full-paths 'Subdirectories will not have their path shortened' + cand -x 'Only count the files and directories on the same filesystem as the supplied directory' + cand --limit-filesystem 'Only count the files and directories on the same filesystem as the supplied directory' + cand -s 'Use file length instead of blocks' + cand --apparent-size 'Use file length instead of blocks' + cand -r 'Print tree upside down (biggest highest)' + cand --reverse 'Print tree upside down (biggest highest)' + cand -c 'No colors will be printed (Useful for commands like: watch)' + cand --no-colors 'No colors will be printed (Useful for commands like: watch)' + cand -b 'No percent bars or percentages will be displayed' + cand --no-percent-bars 'No percent bars or percentages will be displayed' + cand --skip-total 'No total row will be displayed' + cand -f 'Directory ''size'' is number of child files/dirs not disk size' + cand --filecount 'Directory ''size'' is number of child files/dirs not disk size' + cand -i 'Do not display hidden files' + cand --ignore_hidden 'Do not display hidden files' + cand -t 'show only these file types' + cand --file_types 'show only these file types' + cand -H 'print sizes in powers of 1000 (e.g., 1.1G)' + cand --si 'print sizes in powers of 1000 (e.g., 1.1G)' + } + ] + $completions[$command] +} diff --git a/completions/dust.fish b/completions/dust.fish new file mode 100644 index 0000000..a3c5e9f --- /dev/null +++ b/completions/dust.fish @@ -0,0 +1,19 @@ +complete -c dust -s d -l depth -d 'Depth to show' -r +complete -c dust -s n -l number-of-lines -d 'Number of lines of output to show. (Default is terminal_height - 10)' -r +complete -c dust -s X -l ignore-directory -d 'Exclude any file or directory with this name' -r +complete -c dust -s v -l invert-filter -d 'Exclude filepaths matching this regex. To ignore png files type: -v "\\.png$" ' -r +complete -c dust -s e -l filter -d 'Only include filepaths matching this regex. For png files type: -e "\\.png$" ' -r +complete -c dust -s w -l terminal_width -d 'Specify width of output overriding the auto detection of terminal width' -r +complete -c dust -s h -l help -d 'Print help information' +complete -c dust -s V -l version -d 'Print version information' +complete -c dust -s p -l full-paths -d 'Subdirectories will not have their path shortened' +complete -c dust -s x -l limit-filesystem -d 'Only count the files and directories on the same filesystem as the supplied directory' +complete -c dust -s s -l apparent-size -d 'Use file length instead of blocks' +complete -c dust -s r -l reverse -d 'Print tree upside down (biggest highest)' +complete -c dust -s c -l no-colors -d 'No colors will be printed (Useful for commands like: watch)' +complete -c dust -s b -l no-percent-bars -d 'No percent bars or percentages will be displayed' +complete -c dust -l skip-total -d 'No total row will be displayed' +complete -c dust -s f -l filecount -d 'Directory \'size\' is number of child files/dirs not disk size' +complete -c dust -s i -l ignore_hidden -d 'Do not display hidden files' +complete -c dust -s t -l file_types -d 'show only these file types' +complete -c dust -s H -l si -d 'print sizes in powers of 1000 (e.g., 1.1G)' diff --git a/src/cli.rs b/src/cli.rs new file mode 100644 index 0000000..cc6a07d --- /dev/null +++ b/src/cli.rs @@ -0,0 +1,128 @@ +use clap::{Arg, Command}; + +pub(crate) fn build_cli() -> Command<'static> { + Command::new("Dust") + .about("Like du but more intuitive") + .version(env!("CARGO_PKG_VERSION")) + .trailing_var_arg(true) + .arg( + Arg::new("depth") + .short('d') + .long("depth") + .help("Depth to show") + .takes_value(true) + .default_value("18446744073709551615") + ) + .arg( + Arg::new("number_of_lines") + .short('n') + .long("number-of-lines") + .help("Number of lines of output to show. (Default is terminal_height - 10)") + .takes_value(true) + ) + .arg( + Arg::new("display_full_paths") + .short('p') + .long("full-paths") + .help("Subdirectories will not have their path shortened"), + ) + .arg( + Arg::new("ignore_directory") + .short('X') + .long("ignore-directory") + .takes_value(true) + .number_of_values(1) + .multiple_occurrences(true) + .help("Exclude any file or directory with this name"), + ) + .arg( + Arg::new("limit_filesystem") + .short('x') + .long("limit-filesystem") + .help("Only count the files and directories on the same filesystem as the supplied directory"), + ) + .arg( + Arg::new("display_apparent_size") + .short('s') + .long("apparent-size") + .help("Use file length instead of blocks"), + ) + .arg( + Arg::new("reverse") + .short('r') + .long("reverse") + .help("Print tree upside down (biggest highest)"), + ) + .arg( + Arg::new("no_colors") + .short('c') + .long("no-colors") + .help("No colors will be printed (Useful for commands like: watch)"), + ) + .arg( + Arg::new("no_bars") + .short('b') + .long("no-percent-bars") + .help("No percent bars or percentages will be displayed"), + ) + .arg( + Arg::new("skip_total") + .long("skip-total") + .help("No total row will be displayed"), + ) + .arg( + Arg::new("by_filecount") + .short('f') + .long("filecount") + .help("Directory 'size' is number of child files/dirs not disk size"), + ) + .arg( + Arg::new("ignore_hidden") + .short('i') // Do not use 'h' this is used by 'help' + .long("ignore_hidden") + .help("Do not display hidden files"), + ) + .arg( + Arg::new("invert_filter") + .short('v') + .long("invert-filter") + .takes_value(true) + .number_of_values(1) + .multiple_occurrences(true) + .conflicts_with("filter") + .conflicts_with("types") + .help("Exclude filepaths matching this regex. To ignore png files type: -v \"\\.png$\" "), + ) + .arg( + Arg::new("filter") + .short('e') + .long("filter") + .takes_value(true) + .number_of_values(1) + .multiple_occurrences(true) + .conflicts_with("types") + .help("Only include filepaths matching this regex. For png files type: -e \"\\.png$\" "), + ) + .arg( + Arg::new("types") + .short('t') + .long("file_types") + .conflicts_with("depth") + .help("show only these file types"), + ) + .arg( + Arg::new("width") + .short('w') + .long("terminal_width") + .takes_value(true) + .number_of_values(1) + .help("Specify width of output overriding the auto detection of terminal width"), + ) + .arg( + Arg::new("iso") + .short('H') + .long("si") + .help("print sizes in powers of 1000 (e.g., 1.1G)") + ) + .arg(Arg::new("inputs").multiple_occurrences(true).default_value(".")) +} diff --git a/src/display.rs b/src/display.rs index ca077d9..233d4fe 100644 --- a/src/display.rs +++ b/src/display.rs @@ -1,8 +1,6 @@ -extern crate ansi_term; - use crate::display_node::DisplayNode; -use self::ansi_term::Colour::Red; +use ansi_term::Colour::Red; use lscolors::{LsColors, Style}; use unicode_width::UnicodeWidthStr; @@ -215,20 +213,14 @@ fn display_node(node: &DisplayNode, draw_data: &DrawData, is_biggest: bool, is_l let level = ((indent.chars().count() - 1) / 2) - 1; let bar_text = draw_data.generate_bar(node, level); - let to_print = format_string( - node, - &*indent, - &*bar_text, - is_biggest, - draw_data.display_data, - ); + let to_print = format_string(node, &indent, &bar_text, is_biggest, draw_data.display_data); if !draw_data.display_data.is_reversed { println!("{}", to_print) } let dd = DrawData { - indent: clean_indentation_string(&*indent), + indent: clean_indentation_string(&indent), percent_bar: bar_text, display_data: draw_data.display_data, }; diff --git a/src/main.rs b/src/main.rs index afba484..e6a5ec6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,20 @@ -extern crate clap; -extern crate rayon; -extern crate regex; -extern crate unicode_width; +mod cli; +mod config; +mod dir_walker; +mod display; +mod display_node; +mod filter; +mod filter_type; +mod node; +mod platform; +mod utils; +use crate::cli::build_cli; use std::collections::HashSet; use std::process; use self::display::draw_it; -use clap::{crate_version, Arg}; -use clap::{Command, Values}; +use clap::Values; use config::get_config; use dir_walker::{walk_it, WalkData}; use filter::get_biggest; @@ -20,16 +26,6 @@ use terminal_size::{terminal_size, Height, Width}; use utils::get_filesystem_devices; use utils::simplify_dir_names; -mod config; -mod dir_walker; -mod display; -mod display_node; -mod filter; -mod filter_type; -mod node; -mod platform; -mod utils; - static DEFAULT_NUMBER_OF_LINES: usize = 30; static DEFAULT_TERMINAL_WIDTH: usize = 80; @@ -94,131 +90,7 @@ fn get_regex_value(maybe_value: Option) -> Vec { } fn main() { - let options = Command::new("Dust") - .about("Like du but more intuitive") - .version(crate_version!()) - .trailing_var_arg(true) - .arg( - Arg::new("depth") - .short('d') - .long("depth") - .help("Depth to show") - .takes_value(true) - .default_value(usize::MAX.to_string().as_ref()) - ) - .arg( - Arg::new("number_of_lines") - .short('n') - .long("number-of-lines") - .help("Number of lines of output to show. (Default is terminal_height - 10)") - .takes_value(true) - ) - .arg( - Arg::new("display_full_paths") - .short('p') - .long("full-paths") - .help("Subdirectories will not have their path shortened"), - ) - .arg( - Arg::new("ignore_directory") - .short('X') - .long("ignore-directory") - .takes_value(true) - .number_of_values(1) - .multiple_occurrences(true) - .help("Exclude any file or directory with this name"), - ) - .arg( - Arg::new("limit_filesystem") - .short('x') - .long("limit-filesystem") - .help("Only count the files and directories on the same filesystem as the supplied directory"), - ) - .arg( - Arg::new("display_apparent_size") - .short('s') - .long("apparent-size") - .help("Use file length instead of blocks"), - ) - .arg( - Arg::new("reverse") - .short('r') - .long("reverse") - .help("Print tree upside down (biggest highest)"), - ) - .arg( - Arg::new("no_colors") - .short('c') - .long("no-colors") - .help("No colors will be printed (Useful for commands like: watch)"), - ) - .arg( - Arg::new("no_bars") - .short('b') - .long("no-percent-bars") - .help("No percent bars or percentages will be displayed"), - ) - .arg( - Arg::new("skip_total") - .long("skip-total") - .help("No total row will be displayed"), - ) - .arg( - Arg::new("by_filecount") - .short('f') - .long("filecount") - .help("Directory 'size' is number of child files/dirs not disk size"), - ) - .arg( - Arg::new("ignore_hidden") - .short('i') // Do not use 'h' this is used by 'help' - .long("ignore_hidden") - .help("Do not display hidden files"), - ) - .arg( - Arg::new("invert_filter") - .short('v') - .long("invert-filter") - .takes_value(true) - .number_of_values(1) - .multiple_occurrences(true) - .conflicts_with("filter") - .conflicts_with("types") - .help("Exclude filepaths matching this regex. To ignore png files type: -v \"\\.png$\" "), - ) - .arg( - Arg::new("filter") - .short('e') - .long("filter") - .takes_value(true) - .number_of_values(1) - .multiple_occurrences(true) - .conflicts_with("types") - .help("Only include filepaths matching this regex. For png files type: -e \"\\.png$\" "), - ) - .arg( - Arg::new("types") - .short('t') - .long("file_types") - .conflicts_with("depth") - .help("show only these file types"), - ) - .arg( - Arg::new("width") - .short('w') - .long("terminal_width") - .takes_value(true) - .number_of_values(1) - .help("Specify width of output overriding the auto detection of terminal width"), - ) - .arg( - Arg::new("iso") - .short('H') - .long("si") - .help("print sizes in powers of 1000 (e.g., 1.1G)") - ) - .arg(Arg::new("inputs").multiple_occurrences(true).default_value(".")) - .get_matches(); + let options = build_cli().get_matches(); let config = get_config();