Skip to content

Commit dd7cafe

Browse files
authored
Merge pull request #6184 from epage/conflict
fix(parser): Don't panic when subcommands conflict with groups
2 parents bb0b2f1 + 1823cef commit dd7cafe

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

clap_builder/src/parser/parser.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -483,7 +483,8 @@ impl<'cmd> Parser<'cmd> {
483483
pos_sc_name.clone(),
484484
matcher
485485
.arg_ids()
486-
.map(|id| self.cmd.find(id).unwrap().to_string())
486+
// skip groups
487+
.filter_map(|id| self.cmd.find(id).map(|a| a.to_string()))
487488
.collect(),
488489
Usage::new(self.cmd).create_usage_with_title(&[]),
489490
));

tests/builder/conflicts.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -988,3 +988,17 @@ fn args_negate_subcommands_two_levels() {
988988
Some("sub2")
989989
);
990990
}
991+
992+
#[test]
993+
fn group_conrflicts_with_subcommands() {
994+
let c = Command::new("test")
995+
.args_conflicts_with_subcommands(true)
996+
.arg(arg!(-g --directory <PATH>).global(true))
997+
.arg(arg!(<start>))
998+
.group(ArgGroup::new("Cli").arg("directory").arg("start"))
999+
.subcommand(Command::new("delete").short_flag('d'));
1000+
let res = c.try_get_matches_from(["test", "-g", "./", "-d"]);
1001+
assert!(res.is_err());
1002+
let err = res.err().unwrap();
1003+
assert_eq!(err.kind(), ErrorKind::ArgumentConflict);
1004+
}

0 commit comments

Comments
 (0)