diff --git a/src/app.rs b/src/app.rs index c8d80c7cb..6b1f2cbb4 100644 --- a/src/app.rs +++ b/src/app.rs @@ -56,9 +56,9 @@ pub struct Cli { #[arg(short = 'R', long, conflicts_with = "tree")] pub recursive: bool, - /// For ls compatibility purposes ONLY, currently set by default - #[arg(short, long)] - human_readable: bool, + /// Display size in a human readable format, equivalent to `--size default` + #[arg(short, long, overrides_with = "size")] + pub human_readable: bool, /// Recurse into directories and present the result as a tree #[arg(long)] @@ -77,7 +77,7 @@ pub struct Cli { pub permission: Option, /// How to display size [default: default] - #[arg(long, value_name = "MODE", value_parser = ["default", "short", "bytes"])] + #[arg(long, value_name = "MODE", value_parser = ["default", "short", "bytes"], overrides_with = "human_readable")] pub size: Option, /// Display the total size of directories @@ -199,7 +199,7 @@ pub struct Cli { /// Print help information #[arg(long, action = ArgAction::Help)] - help: (), + pub help: (), } fn validate_date_argument(arg: &str) -> Result { diff --git a/src/flags/size.rs b/src/flags/size.rs index 4a116cc50..ef765750e 100644 --- a/src/flags/size.rs +++ b/src/flags/size.rs @@ -39,9 +39,14 @@ impl Configurable for SizeFlag { /// If any of the "default", "short" or "bytes" arguments is passed, the corresponding /// `SizeFlag` variant is returned in a [Some]. If neither of them is passed, this returns /// [None]. + /// + /// The `--human-readable` flag is equivalent to `--size default`. It and `--size` override + /// each other, so whichever is passed last on the command line wins. fn from_cli(cli: &Cli) -> Option { if cli.classic { Some(Self::Bytes) + } else if cli.human_readable { + Some(Self::Default) } else { cli.size.as_deref().map(Self::from_arg_str) } @@ -117,6 +122,34 @@ mod test { assert_eq!(Some(SizeFlag::Short), SizeFlag::from_cli(&cli)); } + #[test] + fn test_from_cli_human_readable() { + let argv = ["lsd", "--human-readable"]; + let cli = Cli::try_parse_from(argv).unwrap(); + assert_eq!(Some(SizeFlag::Default), SizeFlag::from_cli(&cli)); + } + + #[test] + fn test_from_cli_human_readable_overrides_size() { + let argv = ["lsd", "--size", "bytes", "-h"]; + let cli = Cli::try_parse_from(argv).unwrap(); + assert_eq!(Some(SizeFlag::Default), SizeFlag::from_cli(&cli)); + } + + #[test] + fn test_from_cli_size_overrides_human_readable() { + let argv = ["lsd", "-h", "--size", "bytes"]; + let cli = Cli::try_parse_from(argv).unwrap(); + assert_eq!(Some(SizeFlag::Bytes), SizeFlag::from_cli(&cli)); + } + + #[test] + fn test_from_cli_human_readable_classic() { + let argv = ["lsd", "-h", "--classic"]; + let cli = Cli::try_parse_from(argv).unwrap(); + assert_eq!(Some(SizeFlag::Bytes), SizeFlag::from_cli(&cli)); + } + #[test] fn test_from_cli_size_classic() { let argv = ["lsd", "--size", "short", "--classic"];