Skip to content

Commit 50f0230

Browse files
committed
imp: when AppSettings::SubcommandsNegateReqs and ArgsNegateSubcommands are used, a new more accurate double line usage string is shown
Closes #871
1 parent ce5ee5f commit 50f0230

File tree

2 files changed

+21
-12
lines changed

2 files changed

+21
-12
lines changed

src/app/parser.rs

+20-11
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,7 @@ impl<'a, 'b> Parser<'a, 'b>
576576
#[inline]
577577
pub fn has_visible_subcommands(&self) -> bool {
578578
if self.subcommands.is_empty() { return false; }
579-
self.subcommands.iter().any(|s| !s.is_set(AppSettings::Hidden))
579+
self.subcommands.iter().any(|s| !s.p.is_set(AS::Hidden))
580580
}
581581

582582
#[inline]
@@ -2118,15 +2118,16 @@ impl<'a, 'b> Parser<'a, 'b>
21182118
if let Some(u) = self.meta.usage_str {
21192119
usage.push_str(&*u);
21202120
} else if used.is_empty() {
2121-
usage.push_str(&*self.meta
2121+
let name = self.meta
21222122
.usage
21232123
.as_ref()
21242124
.unwrap_or_else(|| {
21252125
self.meta
21262126
.bin_name
21272127
.as_ref()
21282128
.unwrap_or(&self.meta.name)
2129-
}));
2129+
});
2130+
usage.push_str(&*name);
21302131
let mut reqs: Vec<&str> = self.required().map(|r| &**r).collect();
21312132
reqs.dedup();
21322133
let req_string = self.get_required_from(&reqs, None, None)
@@ -2139,9 +2140,9 @@ impl<'a, 'b> Parser<'a, 'b>
21392140
} else if flags {
21402141
usage.push_str(" [OPTIONS]");
21412142
}
2142-
if !self.is_set(AS::UnifiedHelpMessage) && self.has_opts() &&
2143+
if !self.is_set(AS::UnifiedHelpMessage) &&
21432144
self.opts.iter().any(|o| !o.is_set(ArgSettings::Required) &&
2144-
!o.is_set!(AS::Hidden)) {
2145+
!o.is_set(ArgSettings::Hidden)) {
21452146
usage.push_str(" [OPTIONS]");
21462147
}
21472148

@@ -2152,7 +2153,7 @@ impl<'a, 'b> Parser<'a, 'b>
21522153
if self.has_positionals() &&
21532154
self.opts.iter().any(|o| o.is_set(ArgSettings::Multiple)) &&
21542155
self.positionals.values().any(|p| !p.is_set(ArgSettings::Required)) &&
2155-
!self.has_subcommands() {
2156+
!self.has_visible_subcommands() {
21562157
usage.push_str(" [--]")
21572158
}
21582159
if self.has_positionals() &&
@@ -2166,11 +2167,19 @@ impl<'a, 'b> Parser<'a, 'b>
21662167
}
21672168

21682169

2169-
if self.has_subcommands() && !self.is_set(AS::SubcommandRequired) {
2170-
usage.push_str(" [SUBCOMMAND]");
2171-
} else if (self.is_set(AS::SubcommandRequired) ||
2172-
self.is_set(AS::SubcommandRequiredElseHelp)) && self.has_subcommands() {
2173-
usage.push_str(" <SUBCOMMAND>");
2170+
if self.is_set(AS::SubcommandsNegateReqs) || self.is_set(AS::ArgsNegateSubcommands) {
2171+
if self.has_visible_subcommands() {
2172+
usage.push_str("\n ");
2173+
usage.push_str(&*name);
2174+
usage.push_str(" <SUBCOMMAND>");
2175+
}
2176+
} else {
2177+
if self.has_visible_subcommands() && !self.is_set(AS::SubcommandRequired) {
2178+
usage.push_str(" [SUBCOMMAND]");
2179+
} else if (self.is_set(AS::SubcommandRequired) ||
2180+
self.is_set(AS::SubcommandRequiredElseHelp)) && self.has_subcommands() {
2181+
usage.push_str(" <SUBCOMMAND>");
2182+
}
21742183
}
21752184
} else {
21762185
self.smart_usage(&mut usage, used);

tests/positionals.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ fn multiple_positional_one_required_usage_string() {
180180
.arg_from_usage("<FILE> 'some file'")
181181
.arg_from_usage("[FILES]... 'some file'")
182182
.get_matches_from(vec!["test", "file"]);
183-
assert_eq!(m.usage(), "USAGE:\n test <FILE> [ARGS]");
183+
assert_eq!(m.usage(), "USAGE:\n test <FILE> [FILES]...");
184184
}
185185

186186
#[test]

0 commit comments

Comments
 (0)