diff --git a/completions/_dust b/completions/_dust index 4b306627..2b109f26 100644 --- a/completions/_dust +++ b/completions/_dust @@ -31,6 +31,8 @@ _dust() { '(-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]: : ' \ +'-o+[Changes output display size. si will print sizes in powers of 1000. b/bytes kb kib mb mib gb gib will print the whole tree in that size]: : ' \ +'--format=[Changes output display size. si will print sizes in powers of 1000. b/bytes kb kib mb mib gb gib will print the whole tree in that size]: : ' \ '-S+[Specify memory to use as stack size - use if you see\: '\''fatal runtime error\: stack overflow'\'' (default low memory=1048576, high memory=1073741824)]: : ' \ '--stack-size=[Specify memory to use as stack size - use if you see\: '\''fatal runtime error\: stack overflow'\'' (default low memory=1048576, high memory=1073741824)]: : ' \ '-p[Subdirectories will not have their path shortened]' \ @@ -58,16 +60,12 @@ _dust() { '--ignore_hidden[Do not display hidden files]' \ '(-d --depth -D --only-dir)-t[show only these file types]' \ '(-d --depth -D --only-dir)--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)]' \ '-P[Disable the progress indication.]' \ '--no-progress[Disable the progress indication.]' \ '(-F --only-file -t --file_types)-D[Only directories will be displayed.]' \ '(-F --only-file -t --file_types)--only-dir[Only directories will be displayed.]' \ '(-D --only-dir)-F[Only files will be displayed. (Finds your largest files)]' \ '(-D --only-dir)--only-file[Only files will be displayed. (Finds your largest files)]' \ -'-k[display the size of a file or directory in kilobytes]' \ -'--display-kb[display the size of a file or directory in kilobytes]' \ '-h[Print help]' \ '--help[Print help]' \ '-V[Print version]' \ diff --git a/completions/_dust.ps1 b/completions/_dust.ps1 index b8cfb0de..45fbf442 100644 --- a/completions/_dust.ps1 +++ b/completions/_dust.ps1 @@ -37,6 +37,8 @@ Register-ArgumentCompleter -Native -CommandName 'dust' -ScriptBlock { [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('-o', 'o', [CompletionResultType]::ParameterName, 'Changes output display size. si will print sizes in powers of 1000. b/bytes kb kib mb mib gb gib will print the whole tree in that size') + [CompletionResult]::new('--format', 'format', [CompletionResultType]::ParameterName, 'Changes output display size. si will print sizes in powers of 1000. b/bytes kb kib mb mib gb gib will print the whole tree in that size') [CompletionResult]::new('-S', 'S ', [CompletionResultType]::ParameterName, 'Specify memory to use as stack size - use if you see: ''fatal runtime error: stack overflow'' (default low memory=1048576, high memory=1073741824)') [CompletionResult]::new('--stack-size', 'stack-size', [CompletionResultType]::ParameterName, 'Specify memory to use as stack size - use if you see: ''fatal runtime error: stack overflow'' (default low memory=1048576, high memory=1073741824)') [CompletionResult]::new('-p', 'p', [CompletionResultType]::ParameterName, 'Subdirectories will not have their path shortened') @@ -64,16 +66,12 @@ Register-ArgumentCompleter -Native -CommandName 'dust' -ScriptBlock { [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)') [CompletionResult]::new('-P', 'P ', [CompletionResultType]::ParameterName, 'Disable the progress indication.') [CompletionResult]::new('--no-progress', 'no-progress', [CompletionResultType]::ParameterName, 'Disable the progress indication.') [CompletionResult]::new('-D', 'D ', [CompletionResultType]::ParameterName, 'Only directories will be displayed.') [CompletionResult]::new('--only-dir', 'only-dir', [CompletionResultType]::ParameterName, 'Only directories will be displayed.') [CompletionResult]::new('-F', 'F ', [CompletionResultType]::ParameterName, 'Only files will be displayed. (Finds your largest files)') [CompletionResult]::new('--only-file', 'only-file', [CompletionResultType]::ParameterName, 'Only files will be displayed. (Finds your largest files)') - [CompletionResult]::new('-k', 'k', [CompletionResultType]::ParameterName, 'display the size of a file or directory in kilobytes') - [CompletionResult]::new('--display-kb', 'display-kb', [CompletionResultType]::ParameterName, 'display the size of a file or directory in kilobytes') [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help') [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help') [CompletionResult]::new('-V', 'V ', [CompletionResultType]::ParameterName, 'Print version') diff --git a/completions/dust.bash b/completions/dust.bash index 23f3a325..e48702b6 100644 --- a/completions/dust.bash +++ b/completions/dust.bash @@ -19,7 +19,7 @@ _dust() { case "${cmd}" in dust) - opts="-d -n -p -X -I -L -x -s -r -c -b -B -z -R -f -i -v -e -t -w -H -P -D -F -k -S -h -V --depth --number-of-lines --full-paths --ignore-directory --ignore-all-in-file --dereference-links --limit-filesystem --apparent-size --reverse --no-colors --no-percent-bars --bars-on-right --min-size --screen-reader --skip-total --filecount --ignore_hidden --invert-filter --filter --file_types --terminal_width --si --no-progress --only-dir --only-file --display-kb --stack-size --help --version [params]..." + opts="-d -n -p -X -I -L -x -s -r -c -b -B -z -R -f -i -v -e -t -w -P -D -F -o -S -h -V --depth --number-of-lines --full-paths --ignore-directory --ignore-all-in-file --dereference-links --limit-filesystem --apparent-size --reverse --no-colors --no-percent-bars --bars-on-right --min-size --screen-reader --skip-total --filecount --ignore_hidden --invert-filter --filter --file_types --terminal_width --no-progress --only-dir --only-file --format --stack-size --help --version [params]..." if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") ) return 0 @@ -89,6 +89,14 @@ _dust() { COMPREPLY=($(compgen -f "${cur}")) return 0 ;; + --format) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; + -o) + COMPREPLY=($(compgen -f "${cur}")) + return 0 + ;; --stack-size) COMPREPLY=($(compgen -f "${cur}")) return 0 diff --git a/completions/dust.elv b/completions/dust.elv index 915e7493..1e80d909 100644 --- a/completions/dust.elv +++ b/completions/dust.elv @@ -34,6 +34,8 @@ set edit:completion:arg-completer[dust] = {|@words| 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 -o 'Changes output display size. si will print sizes in powers of 1000. b/bytes kb kib mb mib gb gib will print the whole tree in that size' + cand --format 'Changes output display size. si will print sizes in powers of 1000. b/bytes kb kib mb mib gb gib will print the whole tree in that size' cand -S 'Specify memory to use as stack size - use if you see: ''fatal runtime error: stack overflow'' (default low memory=1048576, high memory=1073741824)' cand --stack-size 'Specify memory to use as stack size - use if you see: ''fatal runtime error: stack overflow'' (default low memory=1048576, high memory=1073741824)' cand -p 'Subdirectories will not have their path shortened' @@ -61,16 +63,12 @@ set edit:completion:arg-completer[dust] = {|@words| 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)' cand -P 'Disable the progress indication.' cand --no-progress 'Disable the progress indication.' cand -D 'Only directories will be displayed.' cand --only-dir 'Only directories will be displayed.' cand -F 'Only files will be displayed. (Finds your largest files)' cand --only-file 'Only files will be displayed. (Finds your largest files)' - cand -k 'display the size of a file or directory in kilobytes' - cand --display-kb 'display the size of a file or directory in kilobytes' cand -h 'Print help' cand --help 'Print help' cand -V 'Print version' diff --git a/completions/dust.fish b/completions/dust.fish index a193a90a..4714c35f 100644 --- a/completions/dust.fish +++ b/completions/dust.fish @@ -6,6 +6,7 @@ complete -c dust -s z -l min-size -d 'Minimum size file to include in output' -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 o -l format -d 'Changes output display size. si will print sizes in powers of 1000. b/bytes kb kib mb mib gb gib will print the whole tree in that size' -r complete -c dust -s S -l stack-size -d 'Specify memory to use as stack size - use if you see: \'fatal runtime error: stack overflow\' (default low memory=1048576, high memory=1073741824)' -r complete -c dust -s p -l full-paths -d 'Subdirectories will not have their path shortened' complete -c dust -s L -l dereference-links -d 'dereference sym links - Treat sym links as directories and go into them' @@ -20,10 +21,8 @@ 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 instead of 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)' complete -c dust -s P -l no-progress -d 'Disable the progress indication.' complete -c dust -s D -l only-dir -d 'Only directories will be displayed.' complete -c dust -s F -l only-file -d 'Only files will be displayed. (Finds your largest files)' -complete -c dust -s k -l display-kb -d 'display the size of a file or directory in kilobytes' complete -c dust -s h -l help -d 'Print help' complete -c dust -s V -l version -d 'Print version' diff --git a/man-page/dust.1 b/man-page/dust.1 index 0e344201..9391cc66 100644 --- a/man-page/dust.1 +++ b/man-page/dust.1 @@ -4,7 +4,7 @@ .SH NAME Dust \- Like du but more intuitive .SH SYNOPSIS -\fBDust\fR [\fB\-d\fR|\fB\-\-depth\fR] [\fB\-n\fR|\fB\-\-number\-of\-lines\fR] [\fB\-p\fR|\fB\-\-full\-paths\fR] [\fB\-X\fR|\fB\-\-ignore\-directory\fR] [\fB\-I\fR|\fB\-\-ignore\-all\-in\-file\fR] [\fB\-L\fR|\fB\-\-dereference\-links\fR] [\fB\-x\fR|\fB\-\-limit\-filesystem\fR] [\fB\-s\fR|\fB\-\-apparent\-size\fR] [\fB\-r\fR|\fB\-\-reverse\fR] [\fB\-c\fR|\fB\-\-no\-colors\fR] [\fB\-b\fR|\fB\-\-no\-percent\-bars\fR] [\fB\-B\fR|\fB\-\-bars\-on\-right\fR] [\fB\-z\fR|\fB\-\-min\-size\fR] [\fB\-R\fR|\fB\-\-screen\-reader\fR] [\fB\-\-skip\-total\fR] [\fB\-f\fR|\fB\-\-filecount\fR] [\fB\-i\fR|\fB\-\-ignore_hidden\fR] [\fB\-v\fR|\fB\-\-invert\-filter\fR] [\fB\-e\fR|\fB\-\-filter\fR] [\fB\-t\fR|\fB\-\-file_types\fR] [\fB\-w\fR|\fB\-\-terminal_width\fR] [\fB\-H\fR|\fB\-\-si\fR] [\fB\-P\fR|\fB\-\-no\-progress\fR] [\fB\-D\fR|\fB\-\-only\-dir\fR] [\fB\-F\fR|\fB\-\-only\-file\fR] [\fB\-k\fR|\fB\-\-display\-kb\fR] [\fB\-S\fR|\fB\-\-stack\-size\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] [\fIparams\fR] +\fBDust\fR [\fB\-d\fR|\fB\-\-depth\fR] [\fB\-n\fR|\fB\-\-number\-of\-lines\fR] [\fB\-p\fR|\fB\-\-full\-paths\fR] [\fB\-X\fR|\fB\-\-ignore\-directory\fR] [\fB\-I\fR|\fB\-\-ignore\-all\-in\-file\fR] [\fB\-L\fR|\fB\-\-dereference\-links\fR] [\fB\-x\fR|\fB\-\-limit\-filesystem\fR] [\fB\-s\fR|\fB\-\-apparent\-size\fR] [\fB\-r\fR|\fB\-\-reverse\fR] [\fB\-c\fR|\fB\-\-no\-colors\fR] [\fB\-b\fR|\fB\-\-no\-percent\-bars\fR] [\fB\-B\fR|\fB\-\-bars\-on\-right\fR] [\fB\-z\fR|\fB\-\-min\-size\fR] [\fB\-R\fR|\fB\-\-screen\-reader\fR] [\fB\-\-skip\-total\fR] [\fB\-f\fR|\fB\-\-filecount\fR] [\fB\-i\fR|\fB\-\-ignore_hidden\fR] [\fB\-v\fR|\fB\-\-invert\-filter\fR] [\fB\-e\fR|\fB\-\-filter\fR] [\fB\-t\fR|\fB\-\-file_types\fR] [\fB\-w\fR|\fB\-\-terminal_width\fR] [\fB\-P\fR|\fB\-\-no\-progress\fR] [\fB\-D\fR|\fB\-\-only\-dir\fR] [\fB\-F\fR|\fB\-\-only\-file\fR] [\fB\-o\fR|\fB\-\-format\fR] [\fB\-S\fR|\fB\-\-stack\-size\fR] [\fB\-h\fR|\fB\-\-help\fR] [\fB\-V\fR|\fB\-\-version\fR] [\fIparams\fR] .SH DESCRIPTION Like du but more intuitive .SH OPTIONS @@ -72,9 +72,6 @@ show only these file types \fB\-w\fR, \fB\-\-terminal_width\fR Specify width of output overriding the auto detection of terminal width .TP -\fB\-H\fR, \fB\-\-si\fR -print sizes in powers of 1000 (e.g., 1.1G) -.TP \fB\-P\fR, \fB\-\-no\-progress\fR Disable the progress indication. .TP @@ -84,8 +81,8 @@ Only directories will be displayed. \fB\-F\fR, \fB\-\-only\-file\fR Only files will be displayed. (Finds your largest files) .TP -\fB\-k\fR, \fB\-\-display\-kb\fR -display the size of a file or directory in kilobytes +\fB\-o\fR, \fB\-\-format\fR +Changes output display size. si will print sizes in powers of 1000. b/bytes kb kib mb mib gb gib will print the whole tree in that size .TP \fB\-S\fR, \fB\-\-stack\-size\fR Specify memory to use as stack size \- use if you see: \*(Aqfatal runtime error: stack overflow\*(Aq (default low memory=1048576, high memory=1073741824) diff --git a/src/cli.rs b/src/cli.rs index dd5d01b2..739aa8fe 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -162,13 +162,6 @@ pub fn build_cli() -> Command { .value_parser(value_parser!(usize)) .help("Specify width of output overriding the auto detection of terminal width"), ) - .arg( - Arg::new("iso") - .short('H') - .long("si") - .action(clap::ArgAction::SetTrue) - .help("print sizes in powers of 1000 (e.g., 1.1G)") - ) .arg( Arg::new("disable_progress") .short('P') @@ -194,11 +187,11 @@ pub fn build_cli() -> Command { .help("Only files will be displayed. (Finds your largest files)"), ) .arg( - Arg::new("display_kb") - .short('k') - .long("display-kb") - .action(clap::ArgAction::SetTrue) - .help("display the size of a file or directory in kilobytes"), + Arg::new("output_format") + .short('o') + .long("format") + .value_parser(value_parser!(String)) + .help("Changes output display size. si will print sizes in powers of 1000. b/bytes kb kib mb mib gb gib will print the whole tree in that size") ) .arg( Arg::new("stack_size") diff --git a/src/config.rs b/src/config.rs index 3e058c22..13070b4d 100644 --- a/src/config.rs +++ b/src/config.rs @@ -19,14 +19,13 @@ pub struct Config { pub skip_total: Option, pub screen_reader: Option, pub ignore_hidden: Option, - pub iso: Option, + pub output_format: Option, pub min_size: Option, pub only_dir: Option, pub only_file: Option, pub disable_progress: Option, pub depth: Option, pub bars_on_right: Option, - pub display_kb: Option, pub stack_size: Option, } @@ -57,8 +56,15 @@ impl Config { pub fn get_no_bars(&self, options: &ArgMatches) -> bool { Some(true) == self.no_bars || options.get_flag("no_bars") } - pub fn get_iso(&self, options: &ArgMatches) -> bool { - Some(true) == self.iso || options.get_flag("iso") + pub fn get_output_format(&self, options: &ArgMatches) -> String { + let out_fmt = options.get_one::("output_format"); + (match out_fmt { + None => match &self.output_format { + None => "".to_string(), + Some(x) => x.to_string(), + }, + Some(x) => x.into(), + }).to_lowercase() } pub fn get_skip_total(&self, options: &ArgMatches) -> bool { Some(true) == self.skip_total || options.get_flag("skip_total") @@ -73,17 +79,17 @@ impl Config { self.depth.unwrap_or(usize::MAX) } - pub fn get_min_size(&self, options: &ArgMatches, iso: bool) -> Option { + pub fn get_min_size(&self, options: &ArgMatches, output_format: &str) -> Option { let size_from_param = options.get_one::("min_size"); - self._get_min_size(size_from_param, iso) + self._get_min_size(size_from_param, output_format) } - fn _get_min_size(&self, min_size: Option<&String>, iso: bool) -> Option { - let size_from_param = min_size.and_then(|a| convert_min_size(a, iso)); + fn _get_min_size(&self, min_size: Option<&String>, output_format: &str) -> Option { + let size_from_param = min_size.and_then(|a| convert_min_size(a, output_format)); if size_from_param.is_none() { self.min_size .as_ref() - .and_then(|a| convert_min_size(a.as_ref(), iso)) + .and_then(|a| convert_min_size(a.as_ref(), output_format)) } else { size_from_param } @@ -105,12 +111,9 @@ impl Config { from_cmd_line.copied() } } - pub fn get_display_kb(&self, options: &ArgMatches) -> bool { - Some(true) == self.display_kb || options.get_flag("display_kb") - } } -fn convert_min_size(input: &str, iso: bool) -> Option { +fn convert_min_size(input: &str, output_format: &str) -> Option { let chars_as_vec: Vec = input.chars().collect(); match chars_as_vec.split_last() { Some((last, start)) => { @@ -120,7 +123,8 @@ fn convert_min_size(input: &str, iso: bool) -> Option { if Some(*u) == last.to_uppercase().next() { return match starts.parse::() { Ok(pure) => { - let num: usize = if iso { 1000 } else { 1024 }; + //fix + let num: usize = if output_format.eq("si") { 1000 } else { 1024 }; let marker = pure * num.pow((i + 1) as u32); Some(marker) } @@ -173,13 +177,13 @@ mod tests { #[test] fn test_conversion() { - assert_eq!(convert_min_size("55", false), Some(55)); - assert_eq!(convert_min_size("12344321", false), Some(12344321)); - assert_eq!(convert_min_size("95RUBBISH", false), None); - assert_eq!(convert_min_size("10K", false), Some(10 * 1024)); - assert_eq!(convert_min_size("10M", false), Some(10 * 1024usize.pow(2))); - assert_eq!(convert_min_size("10M", true), Some(10 * 1000usize.pow(2))); - assert_eq!(convert_min_size("2G", false), Some(2 * 1024usize.pow(3))); + assert_eq!(convert_min_size("55", ""), Some(55)); + assert_eq!(convert_min_size("12344321", ""), Some(12344321)); + assert_eq!(convert_min_size("95RUBBISH", ""), None); + assert_eq!(convert_min_size("10K", ""), Some(10 * 1024)); + assert_eq!(convert_min_size("10M", ""), Some(10 * 1024usize.pow(2))); + assert_eq!(convert_min_size("10M", "si"), Some(10 * 1000usize.pow(2))); + assert_eq!(convert_min_size("2G", ""), Some(2 * 1024usize.pow(3))); } #[test] @@ -188,11 +192,11 @@ mod tests { min_size: Some("1K".to_owned()), ..Default::default() }; - assert_eq!(c._get_min_size(None, false), Some(1024)); - assert_eq!(c._get_min_size(Some(&"2K".into()), false), Some(2048)); + assert_eq!(c._get_min_size(None, ""), Some(1024)); + assert_eq!(c._get_min_size(Some(&"2K".into()), ""), Some(2048)); - assert_eq!(c._get_min_size(None, true), Some(1000)); - assert_eq!(c._get_min_size(Some(&"2K".into()), true), Some(2000)); + assert_eq!(c._get_min_size(None, "si"), Some(1000)); + assert_eq!(c._get_min_size(Some(&"2K".into()), "si"), Some(2000)); } #[test] diff --git a/src/display.rs b/src/display.rs index 68bbb4dd..cb623307 100644 --- a/src/display.rs +++ b/src/display.rs @@ -23,9 +23,8 @@ pub struct InitialDisplayData { pub colors_on: bool, pub by_filecount: bool, pub is_screen_reader: bool, - pub iso: bool, + pub output_format: String, pub bars_on_right: bool, - pub display_kb: bool, } pub struct DisplayData { @@ -130,7 +129,6 @@ pub fn draw_it( terminal_width: usize, root_node: &DisplayNode, skip_total: bool, - display_kb: bool, ) { let biggest = match skip_total { false => root_node, @@ -144,7 +142,7 @@ pub fn draw_it( let max_size = biggest.size; max_size.separate_with_commas().chars().count() } else { - find_biggest_size_str(root_node, idd.iso, display_kb) + find_biggest_size_str(root_node, &idd.output_format) }; assert!( @@ -192,12 +190,12 @@ pub fn draw_it( } } -fn find_biggest_size_str(node: &DisplayNode, iso: bool, display_kb: bool) -> usize { - let mut mx = human_readable_number(node.size, iso, display_kb) +fn find_biggest_size_str(node: &DisplayNode, output_format: &str) -> usize { + let mut mx = human_readable_number(node.size, output_format) .chars() .count(); for n in node.children.iter() { - mx = max(mx, find_biggest_size_str(n, iso, display_kb)); + mx = max(mx, find_biggest_size_str(n, output_format)); } mx } @@ -379,11 +377,7 @@ fn get_pretty_size(node: &DisplayNode, is_biggest: bool, display_data: &DisplayD let output = if display_data.initial.by_filecount { node.size.separate_with_commas() } else { - human_readable_number( - node.size, - display_data.initial.iso, - display_data.initial.display_kb, - ) + human_readable_number(node.size, &display_data.initial.output_format) }; let spaces_to_add = display_data.num_chars_needed_on_left_most - output.chars().count(); let output = " ".repeat(spaces_to_add) + output.as_str(); @@ -415,11 +409,20 @@ fn get_pretty_name( } } -pub fn human_readable_number(size: u64, iso: bool, display_kb: bool) -> String { - let num: u64 = if iso { 1000 } else { 1024 }; - if display_kb { - return format!("{:.1}{}", (size as f32 / num as f32), 'K'); +pub fn human_readable_number(size: u64, output_str: &str) -> String { + // fixme + let is_si = output_str.contains("i"); // si, KiB, MiB, etc + let num: u64 = if is_si { 1000 } else { 1024 }; + // if display_kb { + // return format!("{:.1}{}", (size as f32 / num as f32), 'K'); + // } + for (i, u) in UNITS.iter().enumerate() { + if output_str.starts_with((*u).to_ascii_lowercase()){ + let marker = num.pow((UNITS.len() - i ) as u32); + return format!("{}{}", (size / marker), u); + } } + for (i, u) in UNITS.iter().enumerate() { let marker = num.pow((UNITS.len() - i) as u32); if size >= marker { @@ -447,9 +450,8 @@ mod tests { colors_on: false, by_filecount: false, is_screen_reader: false, - iso: false, + output_format: "".into(), bars_on_right: false, - display_kb: false, }; DisplayData { initial, @@ -515,25 +517,26 @@ mod tests { #[test] fn test_human_readable_number() { - assert_eq!(human_readable_number(1, false, false), "1B"); - assert_eq!(human_readable_number(956, false, false), "956B"); - assert_eq!(human_readable_number(1004, false, false), "1004B"); - assert_eq!(human_readable_number(1024, false, false), "1.0K"); - assert_eq!(human_readable_number(1536, false, false), "1.5K"); - assert_eq!(human_readable_number(1024 * 512, false, false), "512K"); - assert_eq!(human_readable_number(1024 * 1024, false, false), "1.0M"); - assert_eq!( - human_readable_number(1024 * 1024 * 1024 - 1, false, false), - "1023M" - ); - assert_eq!( - human_readable_number(1024 * 1024 * 1024 * 20, false, false), - "20G" - ); - assert_eq!( - human_readable_number(1024 * 1024 * 1024 * 1024, false, false), - "1.0T" - ); + assert_eq!(human_readable_number(1, ""), "1B"); + assert_eq!(human_readable_number(956, ""), "956B"); + assert_eq!(human_readable_number(1004, ""), "1004B"); + assert_eq!(human_readable_number(1024, ""), "1.0K"); + assert_eq!(human_readable_number(1536, ""), "1.5K"); + assert_eq!(human_readable_number(1024 * 512, ""), "512K"); + assert_eq!(human_readable_number(1024 * 1024, ""), "1.0M"); + assert_eq!(human_readable_number(1024 * 1024 * 1024 - 1, ""), "1023M"); + assert_eq!(human_readable_number(1024 * 1024 * 1024 * 20, ""), "20G"); + assert_eq!(human_readable_number(1024 * 1024 * 1024 * 1024, ""), "1.0T"); + } + + #[test] + fn test_human_readable_number_kb() { + assert_eq!(human_readable_number(1023, "kb"), "0K"); + assert_eq!(human_readable_number(1023, "kib"), "1K"); + assert_eq!(human_readable_number(1024, "kb"), "1K"); + assert_eq!(human_readable_number(1024 * 512, "kb"), "512K"); + assert_eq!(human_readable_number(1024 * 1024, "kb"), "1024K"); + assert_eq!(human_readable_number(1024 * 1000 * 1000 * 20, "kb"), "20000000K"); } #[cfg(test)] @@ -589,16 +592,4 @@ mod tests { let bar = dd.generate_bar(&n, 5); assert_eq!(bar, "████▓▓▓▓▓▓▓▓▓"); } - #[test] - fn test_human_readable_number_kb() { - assert_eq!(human_readable_number(1, false, true), "0.0K"); - assert_eq!(human_readable_number(1024, false, true), "1.0K"); - assert_eq!(human_readable_number(1536, false, true), "1.5K"); - assert_eq!(human_readable_number(1024 * 512, false, true), "512.0K"); - assert_eq!(human_readable_number(1024 * 1024, false, true), "1024.0K"); - assert_eq!( - human_readable_number(1024 * 1000 * 1000 * 20, false, true), - "20000000.0K" - ); - } } diff --git a/src/main.rs b/src/main.rs index ac93139e..ec024e89 100644 --- a/src/main.rs +++ b/src/main.rs @@ -178,15 +178,13 @@ fn main() { .flat_map(|x| simplified_dirs.iter().map(move |d| d.join(&x))) .collect(); - let iso = config.get_iso(&options); - - let display_kb = config.get_display_kb(&options); + let output_format = config.get_output_format(&options); let ignore_hidden = config.get_ignore_hidden(&options); let mut indicator = PIndicator::build_me(); if !config.get_disable_progress(&options) { - indicator.spawn(iso, display_kb); + indicator.spawn(output_format.clone()) } let walk_data = WalkData { @@ -210,7 +208,7 @@ fn main() { true => get_all_file_types(&top_level_nodes, number_of_lines), false => { let agg_data = AggregateData { - min_size: config.get_min_size(&options, iso), + min_size: config.get_min_size(&options, &output_format), only_dir: config.get_only_dir(&options), only_file: config.get_only_file(&options), number_of_lines, @@ -254,10 +252,9 @@ fn main() { is_reversed: !config.get_reverse(&options), colors_on: !no_colors, by_filecount, - iso, is_screen_reader: config.get_screen_reader(&options), + output_format, bars_on_right: config.get_bars_on_right(&options), - display_kb, }; draw_it( idd, @@ -265,7 +262,6 @@ fn main() { terminal_width, &root_node, config.get_skip_total(&options), - display_kb, ) } } diff --git a/src/progress.rs b/src/progress.rs index afeee047..6d5b7bec 100644 --- a/src/progress.rs +++ b/src/progress.rs @@ -77,26 +77,16 @@ pub struct RuntimeErrors { /* -------------------------------------------------------------------------- */ -fn format_preparing_str( - prog_char: char, - data: &PAtomicInfo, - is_iso: bool, - is_display_kb: bool, -) -> String { +fn format_preparing_str(prog_char: char, data: &PAtomicInfo, output_display: &str) -> String { let path_in = data.current_path.get(); - let size = human_readable_number(data.total_file_size.load(ORDERING), is_iso, is_display_kb); + let size = human_readable_number(data.total_file_size.load(ORDERING), output_display); format!("Preparing: {path_in} {size} ... {prog_char}") } -fn format_indexing_str( - prog_char: char, - data: &PAtomicInfo, - is_iso: bool, - display_kb: bool, -) -> String { +fn format_indexing_str(prog_char: char, data: &PAtomicInfo, output_display: &str) -> String { let path_in = data.current_path.get(); let file_count = data.num_files.load(ORDERING); - let size = human_readable_number(data.total_file_size.load(ORDERING), is_iso, display_kb); + let size = human_readable_number(data.total_file_size.load(ORDERING), output_display); let file_str = format!("{file_count} files, {size}"); format!("Indexing: {path_in} {file_str} ... {prog_char}") } @@ -116,7 +106,7 @@ impl PIndicator { } } - pub fn spawn(&mut self, is_iso: bool, display_kb: bool) { + pub fn spawn(&mut self, output_display: String) { let data = self.data.clone(); let (stop_handler, receiver) = mpsc::channel::<()>(); @@ -135,12 +125,8 @@ impl PIndicator { let prog_char = PROGRESS_CHARS[progress_char_i]; msg = match data.state.load(ORDERING) { - Operation::INDEXING => { - format_indexing_str(prog_char, &data, is_iso, display_kb) - } - Operation::PREPARING => { - format_preparing_str(prog_char, &data, is_iso, display_kb) - } + Operation::INDEXING => format_indexing_str(prog_char, &data, &output_display), + Operation::PREPARING => format_preparing_str(prog_char, &data, &output_display), _ => panic!("Unknown State"), };