fix(parser): Be less confusing with args/subcommand conflicts

The new error message still isn't great but its better than the old one.

Reported at https://hachyderm.io/@eminence/109548978776785113
This commit is contained in:
Ed Page 2022-12-20 20:27:55 -06:00
parent 2a374db639
commit 453ac0bfb9
2 changed files with 28 additions and 30 deletions

View file

@ -502,33 +502,35 @@ impl<'cmd> Parser<'cmd> {
} }
} }
let candidates = suggestions::did_you_mean( if !(self.cmd.is_args_conflicts_with_subcommands_set() && valid_arg_found) {
&arg_os.display().to_string(), let candidates = suggestions::did_you_mean(
self.cmd.all_subcommand_names(), &arg_os.display().to_string(),
); self.cmd.all_subcommand_names(),
// If the argument looks like a subcommand.
if !candidates.is_empty() {
return ClapError::invalid_subcommand(
self.cmd,
arg_os.display().to_string(),
candidates,
self.cmd
.get_bin_name()
.unwrap_or_else(|| self.cmd.get_name())
.to_owned(),
Usage::new(self.cmd).create_usage_with_title(&[]),
); );
} // If the argument looks like a subcommand.
if !candidates.is_empty() {
return ClapError::invalid_subcommand(
self.cmd,
arg_os.display().to_string(),
candidates,
self.cmd
.get_bin_name()
.unwrap_or_else(|| self.cmd.get_name())
.to_owned(),
Usage::new(self.cmd).create_usage_with_title(&[]),
);
}
// If the argument must be a subcommand. // If the argument must be a subcommand.
if self.cmd.has_subcommands() if self.cmd.has_subcommands()
&& (!self.cmd.has_positionals() || self.cmd.is_infer_subcommands_set()) && (!self.cmd.has_positionals() || self.cmd.is_infer_subcommands_set())
{ {
return ClapError::unrecognized_subcommand( return ClapError::unrecognized_subcommand(
self.cmd, self.cmd,
arg_os.display().to_string(), arg_os.display().to_string(),
Usage::new(self.cmd).create_usage_with_title(&[]), Usage::new(self.cmd).create_usage_with_title(&[]),
); );
}
} }
let suggested_trailing_arg = !trailing_values let suggested_trailing_arg = !trailing_values

View file

@ -705,11 +705,7 @@ fn args_negate_subcommands_two_levels() {
#[cfg(feature = "error-context")] #[cfg(feature = "error-context")]
fn subcommand_conflict_error_message() { fn subcommand_conflict_error_message() {
static CONFLICT_ERR: &str = "\ static CONFLICT_ERR: &str = "\
error: The subcommand 'sub1' wasn't recognized error: Found argument 'sub1' which wasn't expected, or isn't valid in this context
Did you mean 'sub1'?
If you believe you received this message in error, try re-running with 'test -- sub1'
Usage: test [OPTIONS] Usage: test [OPTIONS]
test <COMMAND> test <COMMAND>