From 3eacf5b8b0f1e79955a0e7f94dc18b1f6a6b6502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A2=A6=E6=83=B3=E5=AE=9E=E7=8E=B0=E5=AE=B6?= <835683985@qq.com> Date: Mon, 13 Jun 2022 20:39:50 +0800 Subject: [PATCH] fix(builder): Don't double-has arg id in `default_value_ifs_os` (#3815) --- src/builder/arg.rs | 2 +- tests/builder/arg_settings.rs | 43 ++++++++++++++++++++++++++++++++++- 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/src/builder/arg.rs b/src/builder/arg.rs index 0cbd5af2069..2d7f1c01877 100644 --- a/src/builder/arg.rs +++ b/src/builder/arg.rs @@ -3307,7 +3307,7 @@ impl<'help> Arg<'help> { ifs: &[(T, Option<&'help OsStr>, Option<&'help OsStr>)], ) -> Self { for (arg, val, default) in ifs { - self = self.default_value_if_os(arg.key(), *val, *default); + self = self.default_value_if_os(arg, *val, *default); } self } diff --git a/tests/builder/arg_settings.rs b/tests/builder/arg_settings.rs index d4e900ab92c..719721605ec 100644 --- a/tests/builder/arg_settings.rs +++ b/tests/builder/arg_settings.rs @@ -1,5 +1,7 @@ #![allow(deprecated)] -use clap::{Arg, ArgSettings}; + +use clap::{Arg, ArgSettings, Command}; +use std::ffi::OsStr; #[test] fn setting() { @@ -42,3 +44,42 @@ fn unset_setting_bitor() { assert!(!m.is_hide_set(), "{:#?}", m); assert!(!m.is_last_set(), "{:#?}", m); } + +#[test] +fn default_value_ifs_os() { + let cmd = Command::new("my_cargo") + .arg( + Arg::new("flag") + .long("flag") + .allow_invalid_utf8(true) + .takes_value(true), + ) + .arg( + Arg::new("other") + .long("other") + .allow_invalid_utf8(true) + .default_value_ifs_os(&[( + "flag", + Some("标记2").map(OsStr::new), + Some("flag=标记2").map(OsStr::new), + )]), + ); + let result = cmd.try_get_matches_from([ + OsStr::new("my_cargo"), + OsStr::new("--flag"), + OsStr::new("标记2"), + ]); + assert!(result.is_ok()); + match result { + Ok(arg_matches) => { + assert_eq!(arg_matches.value_of_os("flag"), Some(OsStr::new("标记2"))); + assert_eq!( + arg_matches.value_of_os("other"), + Some(OsStr::new("flag=标记2")), + ); + } + Err(e) => { + println!("{}", e.to_string()); + } + } +}