Skip to content

Commit c2ced1a

Browse files
committed
feat: Add default_values_if and default_values_ifs to match default_values
1 parent 79bc1f9 commit c2ced1a

File tree

3 files changed

+403
-3
lines changed

3 files changed

+403
-3
lines changed

clap_builder/src/builder/arg.rs

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ pub struct Arg {
8181
pub(crate) num_vals: Option<ValueRange>,
8282
pub(crate) val_delim: Option<char>,
8383
pub(crate) default_vals: Vec<OsStr>,
84-
pub(crate) default_vals_ifs: Vec<(Id, ArgPredicate, Option<OsStr>)>,
84+
pub(crate) default_vals_ifs: Vec<(Id, ArgPredicate, Option<Vec<OsStr>>)>,
8585
pub(crate) default_missing_vals: Vec<OsStr>,
8686
#[cfg(feature = "env")]
8787
pub(crate) env: Option<(OsStr, Option<OsString>)>,
@@ -3058,7 +3058,53 @@ impl Arg {
30583058
self.default_vals_ifs.push((
30593059
arg_id.into(),
30603060
predicate.into(),
3061-
default.into_resettable().into_option(),
3061+
default
3062+
.into_resettable()
3063+
.into_option()
3064+
.map(|os_str| vec![os_str]),
3065+
));
3066+
self
3067+
}
3068+
3069+
/// Specifies the values of the argument if `arg` has been used at runtime.
3070+
///
3071+
/// See [`Arg::default_value_if`].
3072+
///
3073+
/// # Examples
3074+
///
3075+
/// ```rust
3076+
/// use clap_builder::arg;
3077+
/// use clap_builder::Command;
3078+
/// use clap_builder::Arg;
3079+
/// let r = Command::new("df")
3080+
/// .arg(arg!(--opt <FILE> "some arg"))
3081+
/// .arg(
3082+
/// Arg::new("args")
3083+
/// .long("args")
3084+
/// .num_args(2)
3085+
/// .default_values_if("opt", "value", ["df1","df2"]),
3086+
/// )
3087+
/// .try_get_matches_from(vec!["", "--opt", "value"]);
3088+
///
3089+
/// let m = r.unwrap();
3090+
/// assert_eq!(
3091+
/// m.get_many::<String>("args").unwrap().collect::<Vec<_>>(),
3092+
/// ["df1", "df2"]
3093+
/// );
3094+
/// ```
3095+
///
3096+
/// [`Arg::default_value_if`]: Arg::default_value_if()
3097+
#[must_use]
3098+
pub fn default_values_if(
3099+
mut self,
3100+
arg_id: impl Into<Id>,
3101+
predicate: impl Into<ArgPredicate>,
3102+
defaults: impl IntoIterator<Item = impl Into<OsStr>>,
3103+
) -> Self {
3104+
self.default_vals_ifs.push((
3105+
arg_id.into(),
3106+
predicate.into(),
3107+
Some(defaults.into_iter().map(|item| item.into()).collect()),
30623108
));
30633109
self
30643110
}
@@ -3185,6 +3231,28 @@ impl Arg {
31853231
self
31863232
}
31873233

3234+
/// Specifies multiple values and conditions in the same manner as [`Arg::default_values_if`].
3235+
///
3236+
/// See [`Arg::default_values_if`].
3237+
///
3238+
/// [`Arg::default_values_if`]: Arg::default_values_if()
3239+
#[must_use]
3240+
pub fn default_values_ifs(
3241+
mut self,
3242+
ifs: impl IntoIterator<
3243+
Item = (
3244+
impl Into<Id>,
3245+
impl Into<ArgPredicate>,
3246+
impl IntoIterator<Item = impl Into<OsStr>>,
3247+
),
3248+
>,
3249+
) -> Self {
3250+
for (arg, predicate, default) in ifs {
3251+
self = self.default_values_if(arg, predicate, default);
3252+
}
3253+
self
3254+
}
3255+
31883256
#[must_use]
31893257
#[doc(hidden)]
31903258
#[cfg_attr(

clap_builder/src/parser/parser.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1462,7 +1462,8 @@ impl<'cmd> Parser<'cmd> {
14621462

14631463
if add {
14641464
if let Some(default) = default {
1465-
let arg_values = vec![default.to_os_string()];
1465+
let arg_values =
1466+
default.iter().map(|os_str| os_str.to_os_string()).collect();
14661467
let trailing_idx = None;
14671468
let _ = ok!(self.react(
14681469
None,

0 commit comments

Comments
 (0)