From 5f576631503b54d719ac9758ba9487d937210db7 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Tue, 31 May 2022 20:44:25 -0500 Subject: [PATCH] fix(parser): Apply conditional defaults Now that we can store constants for flags, we can apply defaults for flags too. Fixes #3294 --- src/parser/parser.rs | 7 +----- tests/builder/action.rs | 49 +++++++++++++++++++++++++++++++++++++++++ tests/builder/main.rs | 1 + 3 files changed, 51 insertions(+), 6 deletions(-) create mode 100644 tests/builder/action.rs diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 21523b18c085..118b84f0d2bc 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -1385,12 +1385,7 @@ impl<'help, 'cmd> Parser<'help, 'cmd> { fn add_defaults(&self, matcher: &mut ArgMatcher) -> ClapResult<()> { debug!("Parser::add_defaults"); - for arg in self.cmd.get_opts() { - debug!("Parser::add_defaults:iter:{}:", arg.name); - self.add_default_value(arg, matcher)?; - } - - for arg in self.cmd.get_positionals() { + for arg in self.cmd.get_arguments() { debug!("Parser::add_defaults:iter:{}:", arg.name); self.add_default_value(arg, matcher)?; } diff --git a/tests/builder/action.rs b/tests/builder/action.rs new file mode 100644 index 000000000000..a86baad20204 --- /dev/null +++ b/tests/builder/action.rs @@ -0,0 +1,49 @@ +use clap::builder::ArgAction; +use clap::Arg; +use clap::Command; + +#[test] +fn set_true_with_default_value_if_present() { + let cmd = Command::new("test") + .arg( + Arg::new("mammal") + .long("mammal") + .action(ArgAction::SetTrue) + .default_value_if("dog", None, Some("true")), + ) + .arg(Arg::new("dog").long("dog").action(ArgAction::SetTrue)); + + let matches = cmd.clone().try_get_matches_from(["test", "--dog"]).unwrap(); + assert_eq!(*matches.get_one::("dog").unwrap(), true); + assert_eq!(*matches.get_one::("mammal").unwrap(), true); + + let matches = cmd + .clone() + .try_get_matches_from(["test", "--mammal"]) + .unwrap(); + assert_eq!(matches.get_one::("dog"), None); + assert_eq!(*matches.get_one::("mammal").unwrap(), true); +} + +#[test] +fn set_true_with_default_value_if_value() { + let cmd = Command::new("test") + .arg( + Arg::new("mammal") + .long("mammal") + .action(ArgAction::SetTrue) + .default_value_if("dog", Some("true"), Some("true")), + ) + .arg(Arg::new("dog").long("dog").action(ArgAction::SetTrue)); + + let matches = cmd.clone().try_get_matches_from(["test", "--dog"]).unwrap(); + assert_eq!(*matches.get_one::("dog").unwrap(), true); + assert_eq!(*matches.get_one::("mammal").unwrap(), true); + + let matches = cmd + .clone() + .try_get_matches_from(["test", "--mammal"]) + .unwrap(); + assert_eq!(matches.get_one::("dog"), None); + assert_eq!(*matches.get_one::("mammal").unwrap(), true); +} diff --git a/tests/builder/main.rs b/tests/builder/main.rs index 124111f10117..b034bba7af75 100644 --- a/tests/builder/main.rs +++ b/tests/builder/main.rs @@ -1,3 +1,4 @@ +mod action; mod app_from_crate; mod app_settings; mod arg_aliases;