@@ -52,7 +52,7 @@ pub struct Arg<'a, 'b>
52
52
#[ doc( hidden) ]
53
53
pub requires : Option < Vec < & ' a str > > ,
54
54
#[ doc( hidden) ]
55
- pub group : Option < & ' a str > ,
55
+ pub group : Option < Vec < & ' a str > > ,
56
56
#[ doc( hidden) ]
57
57
pub val_names : Option < VecMap < & ' b str > > ,
58
58
#[ doc( hidden) ]
@@ -176,6 +176,14 @@ impl<'a, 'b> Arg<'a, 'b> {
176
176
}
177
177
a
178
178
}
179
+ "groups" => {
180
+ for ys in v. as_vec ( ) . unwrap ( ) {
181
+ if let Some ( s) = ys. as_str ( ) {
182
+ a = a. group ( s) ;
183
+ }
184
+ }
185
+ a
186
+ }
179
187
"requires" => {
180
188
for ys in v. as_vec ( ) . unwrap ( ) {
181
189
if let Some ( s) = ys. as_str ( ) {
@@ -1612,7 +1620,51 @@ impl<'a, 'b> Arg<'a, 'b> {
1612
1620
/// ```
1613
1621
/// [`ArgGroup`]: ./struct.ArgGroup.html
1614
1622
pub fn group ( mut self , name : & ' a str ) -> Self {
1615
- self . group = Some ( name) ;
1623
+ if let Some ( ref mut vec) = self . requires {
1624
+ vec. push ( name) ;
1625
+ } else {
1626
+ self . group = Some ( vec ! [ name] ) ;
1627
+ }
1628
+ self
1629
+ }
1630
+
1631
+ /// Specifies the names of multiple [`ArgGroup`]'s the argument belongs to.
1632
+ ///
1633
+ /// # Examples
1634
+ ///
1635
+ /// ```rust
1636
+ /// # use clap::{App, Arg};
1637
+ /// Arg::with_name("debug")
1638
+ /// .long("debug")
1639
+ /// .groups(&["mode", "verbosity"])
1640
+ /// # ;
1641
+ /// ```
1642
+ ///
1643
+ /// Arguments can be members of multiple groups and then the group checked as if it
1644
+ /// was one of said arguments.
1645
+ ///
1646
+ /// ```rust
1647
+ /// # use clap::{App, Arg};
1648
+ /// let m = App::new("groups")
1649
+ /// .arg(Arg::with_name("debug")
1650
+ /// .long("debug")
1651
+ /// .groups(&["mode", "verbosity"]))
1652
+ /// .arg(Arg::with_name("verbose")
1653
+ /// .long("verbose")
1654
+ /// .groups(&["mode", "verbosity"]))
1655
+ /// .get_matches_from(vec!["posvals", "--debug"]);
1656
+ /// assert!(m.is_present("mode"));
1657
+ /// assert!(m.is_present("verbosity"));
1658
+ /// ```
1659
+ /// [`ArgGroup`]: ./struct.ArgGroup.html
1660
+ pub fn groups ( mut self , names : & [ & ' a str ] ) -> Self {
1661
+ if let Some ( ref mut vec) = self . group {
1662
+ for s in names {
1663
+ vec. push ( s) ;
1664
+ }
1665
+ } else {
1666
+ self . group = Some ( names. into_iter ( ) . map ( |s| * s) . collect :: < Vec < _ > > ( ) ) ;
1667
+ }
1616
1668
self
1617
1669
}
1618
1670
@@ -2234,7 +2286,7 @@ impl<'a, 'b, 'z> From<&'z Arg<'a, 'b>> for Arg<'a, 'b> {
2234
2286
min_vals : a. min_vals ,
2235
2287
max_vals : a. max_vals ,
2236
2288
val_names : a. val_names . clone ( ) ,
2237
- group : a. group ,
2289
+ group : a. group . clone ( ) ,
2238
2290
validator : a. validator . clone ( ) ,
2239
2291
overrides : a. overrides . clone ( ) ,
2240
2292
settings : a. settings ,
@@ -2261,7 +2313,7 @@ impl<'a, 'b> Clone for Arg<'a, 'b> {
2261
2313
min_vals : self . min_vals ,
2262
2314
max_vals : self . max_vals ,
2263
2315
val_names : self . val_names . clone ( ) ,
2264
- group : self . group ,
2316
+ group : self . group . clone ( ) ,
2265
2317
validator : self . validator . clone ( ) ,
2266
2318
overrides : self . overrides . clone ( ) ,
2267
2319
settings : self . settings ,
0 commit comments