From b2d1ebef4b03459a875228d4cfb2fb56d6e6ca1d Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 8 Feb 2022 12:34:10 -0600 Subject: [PATCH] fix(help): ArgsRequiredElseHelp should ignore defaults Fixes #1264 --- src/parse/arg_matcher.rs | 4 ---- src/parse/validator.rs | 6 +++++- tests/builder/app_settings.rs | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/parse/arg_matcher.rs b/src/parse/arg_matcher.rs index f454b931c0a..22e1d314ac1 100644 --- a/src/parse/arg_matcher.rs +++ b/src/parse/arg_matcher.rs @@ -101,10 +101,6 @@ impl ArgMatcher { self.0.args.contains_key(arg) } - pub(crate) fn is_empty(&self) -> bool { - self.0.args.is_empty() - } - pub(crate) fn arg_names(&self) -> indexmap::map::Keys { self.0.args.keys() } diff --git a/src/parse/validator.rs b/src/parse/validator.rs index c0763bea7c1..244620e7f83 100644 --- a/src/parse/validator.rs +++ b/src/parse/validator.rs @@ -54,7 +54,11 @@ impl<'help, 'app, 'parser> Validator<'help, 'app, 'parser> { } } - if matcher.is_empty() + let num_user_values = matcher + .arg_names() + .filter(|arg_id| matcher.check_explicit(arg_id, ArgPredicate::IsPresent)) + .count(); + if num_user_values == 0 && matcher.subcommand_name().is_none() && self.p.is_set(AS::ArgRequiredElseHelp) { diff --git a/tests/builder/app_settings.rs b/tests/builder/app_settings.rs index b9945eaa44d..3ce23edccca 100644 --- a/tests/builder/app_settings.rs +++ b/tests/builder/app_settings.rs @@ -259,6 +259,21 @@ fn arg_required_else_help_over_reqs() { ); } +#[test] +fn arg_required_else_help_with_default() { + let result = App::new("arg_required") + .setting(AppSettings::ArgRequiredElseHelp) + .arg(arg!(--input ).required(false).default_value("-")) + .try_get_matches_from(vec![""]); + + assert!(result.is_err()); + let err = result.err().unwrap(); + assert_eq!( + err.kind(), + ErrorKind::DisplayHelpOnMissingArgumentOrSubcommand + ); +} + #[test] fn arg_required_else_help_error_message() { let app = App::new("test")