Skip to content

Commit

Permalink
fix: adds a debug assertion to ensure all args added to groups actual…
Browse files Browse the repository at this point in the history
…ly exist

Closes #917
  • Loading branch information
kbknapp committed May 16, 2017
1 parent cbea3d5 commit 7ad123e
Showing 1 changed file with 48 additions and 10 deletions.
58 changes: 48 additions & 10 deletions src/app/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,49 @@ impl<'a, 'b> Parser<'a, 'b>
self.gen_completions_to(for_shell, &mut file)
}

#[inline]
fn app_debug_asserts(&mut self) -> bool {
assert!(self.verify_positionals());
let should_err = self.groups
.iter()
.all(|g| {
g.args
.iter()
.all(|arg| {
(self.flags.iter().any(|f| &f.b.name == arg) ||
self.opts.iter().any(|o| &o.b.name == arg) ||
self.positionals.values().any(|p| &p.b.name == arg) ||
self.groups.iter().any(|g| &g.name == arg))
})
});
let g = self.groups
.iter()
.find(|g| {
g.args
.iter()
.any(|arg| {
!(self.flags.iter().any(|f| &f.b.name == arg) ||
self.opts.iter().any(|o| &o.b.name == arg) ||
self.positionals.values().any(|p| &p.b.name == arg) ||
self.groups.iter().any(|g| &g.name == arg))
})
});
assert!(should_err,
"The group '{}' contains the arg '{}' that doesn't actually exist.",
g.unwrap().name,
g.unwrap()
.args
.iter()
.find(|arg| {
!(self.flags.iter().any(|f| &&f.b.name == arg) ||
self.opts.iter().any(|o| &&o.b.name == arg) ||
self.positionals.values().any(|p| &&p.b.name == arg) ||
self.groups.iter().any(|g| &&g.name == arg))
})
.unwrap());
true
}

#[inline]
fn debug_asserts(&self, a: &Arg) -> bool {
assert!(!arg_names!(self).any(|name| name == a.b.name),
Expand Down Expand Up @@ -417,9 +460,7 @@ impl<'a, 'b> Parser<'a, 'b>
if self.flags.is_empty() {
return false;
}
self.flags
.iter()
.any(|f| !f.is_set(ArgSettings::Hidden))
self.flags.iter().any(|f| !f.is_set(ArgSettings::Hidden))
}

#[inline]
Expand Down Expand Up @@ -771,7 +812,7 @@ impl<'a, 'b> Parser<'a, 'b>
{
debugln!("Parser::get_matches_with;");
// Verify all positional assertions pass
debug_assert!(self.verify_positionals());
debug_assert!(self.app_debug_asserts());
if self.positionals
.values()
.any(|a| {
Expand Down Expand Up @@ -1244,8 +1285,7 @@ impl<'a, 'b> Parser<'a, 'b>
let arg = FlagBuilder {
b: Base {
name: "vclap_version",
help: self.version_message
.or(Some("Prints version information")),
help: self.version_message.or(Some("Prints version information")),
..Default::default()
},
s: Switched {
Expand All @@ -1261,7 +1301,7 @@ impl<'a, 'b> Parser<'a, 'b>
debugln!("Parser::create_help_and_version: Building help");
self.subcommands
.push(App::new("help")
.about("Prints this message or the help of the given subcommand(s)"));
.about("Prints this message or the help of the given subcommand(s)"));
}
}

Expand Down Expand Up @@ -1307,9 +1347,7 @@ impl<'a, 'b> Parser<'a, 'b>
fn use_long_help(&self) -> bool {
let ul = self.flags.iter().any(|f| f.b.long_help.is_some()) ||
self.opts.iter().any(|o| o.b.long_help.is_some()) ||
self.positionals
.values()
.any(|p| p.b.long_help.is_some()) ||
self.positionals.values().any(|p| p.b.long_help.is_some()) ||
self.subcommands
.iter()
.any(|s| s.p.meta.long_about.is_some());
Expand Down

0 comments on commit 7ad123e

Please sign in to comment.