Skip to content

Commit

Permalink
Merge pull request #2619 from rami3l/flag-literal
Browse files Browse the repository at this point in the history
fix(parser): Ban long flags with literals
  • Loading branch information
pksunkara committed Aug 1, 2021
2 parents e649e1b + d848c88 commit 4bec66d
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 3 deletions.
33 changes: 30 additions & 3 deletions src/parse/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1075,11 +1075,38 @@ impl<'help, 'app> Parser<'help, 'app> {
self.app.settings.set(AS::ValidArgFound);
self.seen.push(opt.id.clone());
if opt.is_set(ArgSettings::TakesValue) {
debug!(
"Parser::parse_long_arg: Found an opt with value '{:?}'",
&val
);
return self.parse_opt(&val, opt, matcher);
} else {
self.check_for_help_and_version_str(&arg)?;
return Ok(self.parse_flag(opt, matcher));
}
debug!("Parser::parse_long_arg: Found a flag");
if let Some(rest) = val {
debug!(
"Parser::parse_long_arg: Got invalid literal `{:?}`",
rest.to_os_string()
);
let used: Vec<Id> = matcher
.arg_names()
.filter(|&n| {
self.app.find(n).map_or(true, |a| {
!(a.is_set(ArgSettings::Hidden) || self.required.contains(&a.id))
})
})
.cloned()
.collect();

return Err(ClapError::too_many_values(
rest.to_string_lossy().into(),
opt,
Usage::new(self).create_usage_no_title(&used),
self.app.color(),
));
}
self.check_for_help_and_version_str(&arg)?;
debug!("Parser::parse_long_arg: Presence validated");
return Ok(self.parse_flag(opt, matcher));
}

if let Some(sc_name) = self.possible_long_flag_subcommand(&arg) {
Expand Down
11 changes: 11 additions & 0 deletions tests/flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,17 @@ fn flag_using_long() {
assert!(m.is_present("color"));
}

#[test]
fn flag_using_long_with_literals() {
use clap::ErrorKind;

let m = App::new("flag")
.arg(Arg::new("rainbow").long("rainbow"))
.try_get_matches_from(vec!["", "--rainbow=false"]);
assert!(m.is_err(), "{:#?}", m.unwrap());
assert_eq!(m.unwrap_err().kind, ErrorKind::TooManyValues);
}

#[test]
fn flag_using_mixed() {
let m = App::new("flag")
Expand Down

0 comments on commit 4bec66d

Please sign in to comment.