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