@@ -81,7 +81,7 @@ pub struct Arg {
81
81
pub ( crate ) num_vals : Option < ValueRange > ,
82
82
pub ( crate ) val_delim : Option < char > ,
83
83
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 , Vec < Option < OsStr > > ) > ,
85
85
pub ( crate ) default_missing_vals : Vec < OsStr > ,
86
86
#[ cfg( feature = "env" ) ]
87
87
pub ( crate ) env : Option < ( OsStr , Option < OsString > ) > ,
@@ -3058,11 +3058,62 @@ impl Arg {
3058
3058
self . default_vals_ifs . push ( (
3059
3059
arg_id. into ( ) ,
3060
3060
predicate. into ( ) ,
3061
- default. into_resettable ( ) . into_option ( ) ,
3061
+ vec ! [ default . into_resettable( ) . into_option( ) ] ,
3062
3062
) ) ;
3063
3063
self
3064
3064
}
3065
3065
3066
+ /// Specifies the values of the argument if `arg` has been used at runtime.
3067
+ ///
3068
+ /// See [`Arg::default_value_if`].
3069
+ ///
3070
+ /// # Examples
3071
+ ///
3072
+ /// ```rust
3073
+ /// use clap_builder::arg;
3074
+ /// use clap_builder::Command;
3075
+ /// use clap_builder::Arg;
3076
+ /// let r = Command::new("df")
3077
+ /// .arg(arg!(--opt <FILE> "some arg"))
3078
+ /// .arg(
3079
+ /// Arg::new("args")
3080
+ /// .long("args")
3081
+ /// .num_args(2)
3082
+ /// .default_values_if("opt", "value", ["df1","df2"]),
3083
+ /// )
3084
+ /// .try_get_matches_from(vec!["", "--opt", "value"]);
3085
+ ///
3086
+ /// let m = r.unwrap();
3087
+ /// assert_eq!(
3088
+ /// m.get_many::<String>("args").unwrap().collect::<Vec<_>>(),
3089
+ /// ["df1", "df2"]
3090
+ /// );
3091
+ /// ```
3092
+ ///
3093
+ /// [`Arg::default_value_if`]: Arg::default_value_if()
3094
+ #[ must_use]
3095
+ pub fn default_values_if (
3096
+ mut self ,
3097
+ arg_id : impl Into < Id > ,
3098
+ predicate : impl Into < ArgPredicate > ,
3099
+ defaults : impl IntoIterator < Item = impl Into < OsStr > > ,
3100
+ ) -> Self {
3101
+ let default_vals: Vec < Option < OsStr > > = defaults
3102
+ . into_iter ( )
3103
+ . map ( |val| {
3104
+ let val_osstr: OsStr = val. into ( ) ;
3105
+ if val_osstr. is_empty ( ) {
3106
+ None
3107
+ } else {
3108
+ Some ( val_osstr)
3109
+ }
3110
+ } )
3111
+ . collect ( ) ;
3112
+ self . default_vals_ifs
3113
+ . push ( ( arg_id. into ( ) , predicate. into ( ) , default_vals) ) ;
3114
+ self
3115
+ }
3116
+
3066
3117
#[ must_use]
3067
3118
#[ doc( hidden) ]
3068
3119
#[ cfg_attr(
@@ -3185,6 +3236,28 @@ impl Arg {
3185
3236
self
3186
3237
}
3187
3238
3239
+ /// Specifies multiple values and conditions in the same manner as [`Arg::default_values_if`].
3240
+ ///
3241
+ /// See [`Arg::default_values_if`].
3242
+ ///
3243
+ /// [`Arg::default_values_if`]: Arg::default_values_if()
3244
+ #[ must_use]
3245
+ pub fn default_values_ifs (
3246
+ mut self ,
3247
+ ifs : impl IntoIterator <
3248
+ Item = (
3249
+ impl Into < Id > ,
3250
+ impl Into < ArgPredicate > ,
3251
+ impl IntoIterator < Item = impl Into < OsStr > > ,
3252
+ ) ,
3253
+ > ,
3254
+ ) -> Self {
3255
+ for ( arg, predicate, default) in ifs {
3256
+ self = self . default_values_if ( arg, predicate, default) ;
3257
+ }
3258
+ self
3259
+ }
3260
+
3188
3261
#[ must_use]
3189
3262
#[ doc( hidden) ]
3190
3263
#[ cfg_attr(
0 commit comments