Skip to content

Commit

Permalink
Merge pull request #5520 from epage/exclusive
Browse files Browse the repository at this point in the history
fix(parser): Allow exclusive to override required_*
  • Loading branch information
epage committed Jun 6, 2024
2 parents 5e3386b + 08656d0 commit ea7bfe2
Show file tree
Hide file tree
Showing 2 changed files with 121 additions and 1 deletion.
2 changes: 1 addition & 1 deletion clap_builder/src/parser/validator.rs
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ impl<'cmd> Validator<'cmd> {
required = true;
}

if required {
if !is_exclusive_present && required {
missing_required.push(a.get_id().clone());
if !a.is_last_set() {
highest_index = highest_index.max(a.get_index().unwrap_or(0));
Expand Down
120 changes: 120 additions & 0 deletions tests/builder/conflicts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -684,6 +684,126 @@ fn exclusive_with_required() {
cmd.clone().try_get_matches_from(["bug", "--test"]).unwrap();
}

#[test]
fn exclusive_with_required_unless_present() {
let cmd = Command::new("bug")
.arg(
Arg::new("exclusive")
.long("exclusive")
.action(ArgAction::SetTrue)
.exclusive(true),
)
.arg(
Arg::new("required")
.long("required")
.action(ArgAction::SetTrue)
.required_unless_present("alternative"),
)
.arg(
Arg::new("alternative")
.long("alternative")
.action(ArgAction::SetTrue),
);

cmd.clone()
.try_get_matches_from(["bug", "--required"])
.unwrap();

cmd.clone()
.try_get_matches_from(["bug", "--alternative"])
.unwrap();

cmd.clone().try_get_matches_from(["bug"]).unwrap_err();

cmd.clone()
.try_get_matches_from(["bug", "--exclusive", "--required"])
.unwrap_err();

cmd.clone()
.try_get_matches_from(["bug", "--exclusive"])
.unwrap();
}

#[test]
fn exclusive_with_required_unless_present_any() {
let cmd = Command::new("bug")
.arg(
Arg::new("exclusive")
.long("exclusive")
.action(ArgAction::SetTrue)
.exclusive(true),
)
.arg(
Arg::new("required")
.long("required")
.action(ArgAction::SetTrue)
.required_unless_present_any(["alternative"]),
)
.arg(
Arg::new("alternative")
.long("alternative")
.action(ArgAction::SetTrue),
);

cmd.clone()
.try_get_matches_from(["bug", "--required"])
.unwrap();

cmd.clone()
.try_get_matches_from(["bug", "--alternative"])
.unwrap();

cmd.clone().try_get_matches_from(["bug"]).unwrap_err();

cmd.clone()
.try_get_matches_from(["bug", "--exclusive", "--required"])
.unwrap_err();

cmd.clone()
.try_get_matches_from(["bug", "--exclusive"])
.unwrap();
}

#[test]
fn exclusive_with_required_unless_present_all() {
let cmd = Command::new("bug")
.arg(
Arg::new("exclusive")
.long("exclusive")
.action(ArgAction::SetTrue)
.exclusive(true),
)
.arg(
Arg::new("required")
.long("required")
.action(ArgAction::SetTrue)
.required_unless_present_all(["alternative"]),
)
.arg(
Arg::new("alternative")
.long("alternative")
.action(ArgAction::SetTrue),
);

cmd.clone()
.try_get_matches_from(["bug", "--required"])
.unwrap();

cmd.clone()
.try_get_matches_from(["bug", "--alternative"])
.unwrap();

cmd.clone().try_get_matches_from(["bug"]).unwrap_err();

cmd.clone()
.try_get_matches_from(["bug", "--exclusive", "--required"])
.unwrap_err();

cmd.clone()
.try_get_matches_from(["bug", "--exclusive"])
.unwrap();
}

#[test]
#[cfg(feature = "error-context")]
fn option_conflicts_with_subcommand() {
Expand Down

0 comments on commit ea7bfe2

Please sign in to comment.