Skip to content

Commit b877345

Browse files
authored
Merge pull request #4573 from epage/conflict
fix(parser): Override required when parent group has conflict
2 parents 0eccd55 + 85ecb3e commit b877345

2 files changed

Lines changed: 40 additions & 2 deletions

File tree

src/parser/validator.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -371,8 +371,17 @@ impl<'cmd> Validator<'cmd> {
371371

372372
fn is_missing_required_ok(&self, a: &Arg, conflicts: &Conflicts) -> bool {
373373
debug!("Validator::is_missing_required_ok: {}", a.get_id());
374-
let conflicts = conflicts.gather_conflicts(self.cmd, a.get_id());
375-
!conflicts.is_empty()
374+
if !conflicts.gather_conflicts(self.cmd, a.get_id()).is_empty() {
375+
debug!("Validator::is_missing_required_ok: true (self)");
376+
return true;
377+
}
378+
for group_id in self.cmd.groups_for_arg(a.get_id()) {
379+
if !conflicts.gather_conflicts(self.cmd, &group_id).is_empty() {
380+
debug!("Validator::is_missing_required_ok: true ({})", group_id);
381+
return true;
382+
}
383+
}
384+
false
376385
}
377386

378387
// Failing a required unless means, the arg's "unless" wasn't present, and neither were they

tests/builder/conflicts.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,35 @@ fn arg_conflicts_with_required_group() {
235235
}
236236
}
237237

238+
#[test]
239+
fn arg_conflicts_with_group_with_required_memeber() {
240+
let mut cmd = Command::new("group_conflict")
241+
.arg(arg!(-f --flag "some flag").conflicts_with("gr"))
242+
.group(ArgGroup::new("gr").arg("some").arg("other"))
243+
.arg(arg!(--some "some arg").required(true))
244+
.arg(arg!(--other "other arg"));
245+
246+
let result = cmd.try_get_matches_from_mut(vec!["myprog", "--other", "-f"]);
247+
assert!(result.is_err());
248+
let err = result.err().unwrap();
249+
assert_eq!(err.kind(), ErrorKind::ArgumentConflict);
250+
251+
let result = cmd.try_get_matches_from_mut(vec!["myprog", "-f", "--some"]);
252+
assert!(result.is_err());
253+
let err = result.err().unwrap();
254+
assert_eq!(err.kind(), ErrorKind::ArgumentConflict);
255+
256+
let result = cmd.try_get_matches_from_mut(vec!["myprog", "--some"]);
257+
if let Err(err) = result {
258+
panic!("{}", err);
259+
}
260+
261+
let result = cmd.try_get_matches_from_mut(vec!["myprog", "--flag"]);
262+
if let Err(err) = result {
263+
panic!("{}", err);
264+
}
265+
}
266+
238267
#[test]
239268
fn required_group_conflicts_with_arg() {
240269
let mut cmd = Command::new("group_conflict")

0 commit comments

Comments
 (0)