Skip to content

Commit 4bb4c3c

Browse files
committed
fix(RequiredArgs): required by default args should no longer be required when their exclusions are present
1 parent 09eb4d9 commit 4bb4c3c

File tree

2 files changed

+58
-5
lines changed

2 files changed

+58
-5
lines changed

src/app.rs

+36-5
Original file line numberDiff line numberDiff line change
@@ -1124,11 +1124,13 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
11241124
self.validate_blacklist(&matches);
11251125

11261126
if !self.required.is_empty() {
1127-
println!("reqs: {:?}", self.required);
1128-
println!("bls: {:?}", self.blacklist);
1129-
println!("grps: {:?}", self.groups);
1130-
self.report_error("One or more required arguments were not supplied".to_owned(),
1131-
true, true);
1127+
// println!("reqs: {:?}", self.required);
1128+
// println!("bls: {:?}", self.blacklist);
1129+
// println!("grps: {:?}", self.groups);
1130+
if self.validate_required(&matches) {
1131+
self.report_error("One or more required arguments were not supplied".to_owned(),
1132+
true, true);
1133+
}
11321134
}
11331135

11341136
matches.usage = Some(self.create_usage());
@@ -1504,4 +1506,33 @@ impl<'a, 'v, 'ab, 'u, 'h, 'ar> App<'a, 'v, 'ab, 'u, 'h, 'ar>{
15041506
}
15051507
}
15061508

1509+
fn validate_required(&self, matches: &ArgMatches<'ar, 'ar>) -> bool{
1510+
for name in self.required.iter() {
1511+
validate_reqs!(self, flags, matches, name);
1512+
1513+
validate_reqs!(self, opts, matches, name);
1514+
1515+
// because positions use different keys, we dont use the macro
1516+
match self.positionals_idx.values().filter(|ref p| &p.name == name).next() {
1517+
Some(p) =>{
1518+
if let Some(ref bl) = p.blacklist {
1519+
for n in bl.iter() {
1520+
if matches.args.contains_key(n) {
1521+
return false
1522+
} else if self.groups.contains_key(n) {
1523+
let grp = self.groups.get(n).unwrap();
1524+
for an in grp.args.iter() {
1525+
if matches.args.contains_key(an) {
1526+
return false
1527+
}
1528+
}
1529+
}
1530+
}
1531+
}
1532+
},
1533+
None =>(),
1534+
}
1535+
}
1536+
true
1537+
}
15071538
}

src/macros.rs

+22
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,28 @@ macro_rules! parse_group_reqs {
4747
};
4848
}
4949

50+
// De-duplication macro used in src/app.rs
51+
macro_rules! validate_reqs {
52+
($me:ident, $t:ident, $m:ident, $n:ident) => {
53+
if let Some(a) = $me.$t.get($n) {
54+
if let Some(ref bl) = a.blacklist {
55+
for n in bl.iter() {
56+
if $m.args.contains_key(n) {
57+
return false
58+
} else if $me.groups.contains_key(n) {
59+
let grp = $me.groups.get(n).unwrap();
60+
for an in grp.args.iter() {
61+
if $m.args.contains_key(an) {
62+
return false
63+
}
64+
}
65+
}
66+
}
67+
}
68+
}
69+
};
70+
}
71+
5072
// Thanks to bluss and flan3002 in #rust IRC
5173
//
5274
// Helps with rightward drift when iterating over something and matching each item.

0 commit comments

Comments
 (0)