@@ -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(
0 commit comments