Skip to content

Commit 596e98c

Browse files
authored
Merge pull request #6129 from cooronx/feat_default_values_if_and_default_values_ifs
feat: Add default_values_if and default_values_ifs
2 parents e82e1ed + c2ced1a commit 596e98c

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>)>,
@@ -3061,7 +3061,53 @@ impl Arg {
30613061
self.default_vals_ifs.push((
30623062
arg_id.into(),
30633063
predicate.into(),
3064-
default.into_resettable().into_option(),
3064+
default
3065+
.into_resettable()
3066+
.into_option()
3067+
.map(|os_str| vec![os_str]),
3068+
));
3069+
self
3070+
}
3071+
3072+
/// Specifies the values of the argument if `arg` has been used at runtime.
3073+
///
3074+
/// See [`Arg::default_value_if`].
3075+
///
3076+
/// # Examples
3077+
///
3078+
/// ```rust
3079+
/// use clap_builder::arg;
3080+
/// use clap_builder::Command;
3081+
/// use clap_builder::Arg;
3082+
/// let r = Command::new("df")
3083+
/// .arg(arg!(--opt <FILE> "some arg"))
3084+
/// .arg(
3085+
/// Arg::new("args")
3086+
/// .long("args")
3087+
/// .num_args(2)
3088+
/// .default_values_if("opt", "value", ["df1","df2"]),
3089+
/// )
3090+
/// .try_get_matches_from(vec!["", "--opt", "value"]);
3091+
///
3092+
/// let m = r.unwrap();
3093+
/// assert_eq!(
3094+
/// m.get_many::<String>("args").unwrap().collect::<Vec<_>>(),
3095+
/// ["df1", "df2"]
3096+
/// );
3097+
/// ```
3098+
///
3099+
/// [`Arg::default_value_if`]: Arg::default_value_if()
3100+
#[must_use]
3101+
pub fn default_values_if(
3102+
mut self,
3103+
arg_id: impl Into<Id>,
3104+
predicate: impl Into<ArgPredicate>,
3105+
defaults: impl IntoIterator<Item = impl Into<OsStr>>,
3106+
) -> Self {
3107+
self.default_vals_ifs.push((
3108+
arg_id.into(),
3109+
predicate.into(),
3110+
Some(defaults.into_iter().map(|item| item.into()).collect()),
30653111
));
30663112
self
30673113
}
@@ -3188,6 +3234,28 @@ impl Arg {
31883234
self
31893235
}
31903236

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

clap_builder/src/parser/parser.rs

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

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

0 commit comments

Comments
 (0)