Skip to content

Commit 2573e85

Browse files
committed
fix(parser): Fill in defaults on ignored error
This came up in #5812 and is especially problematic for derives.
1 parent 81a782b commit 2573e85

File tree

2 files changed

+25
-12
lines changed

2 files changed

+25
-12
lines changed

clap_builder/src/parser/parser.rs

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,30 @@ impl<'cmd> Parser<'cmd> {
5050
&mut self,
5151
matcher: &mut ArgMatcher,
5252
raw_args: &mut clap_lex::RawArgs,
53-
mut args_cursor: clap_lex::ArgCursor,
53+
args_cursor: clap_lex::ArgCursor,
5454
) -> ClapResult<()> {
5555
debug!("Parser::get_matches_with");
56+
57+
let res = self.parse(matcher, raw_args, args_cursor);
58+
59+
ok!(self.resolve_pending(matcher));
60+
#[cfg(feature = "env")]
61+
ok!(self.add_env(matcher));
62+
ok!(self.add_defaults(matcher));
63+
64+
let parse_state = res?;
65+
Validator::new(self.cmd).validate(parse_state, matcher)
66+
}
67+
68+
// The actual parsing function
69+
#[allow(clippy::cognitive_complexity)]
70+
pub(crate) fn parse(
71+
&mut self,
72+
matcher: &mut ArgMatcher,
73+
raw_args: &mut clap_lex::RawArgs,
74+
mut args_cursor: clap_lex::ArgCursor,
75+
) -> ClapResult<ParseState> {
76+
debug!("Parser::parse");
5677
// Verify all positional assertions pass
5778

5879
let mut subcmd_name: Option<String> = None;
@@ -436,11 +457,7 @@ impl<'cmd> Parser<'cmd> {
436457
matches: sc_m.into_inner(),
437458
});
438459

439-
ok!(self.resolve_pending(matcher));
440-
#[cfg(feature = "env")]
441-
ok!(self.add_env(matcher));
442-
ok!(self.add_defaults(matcher));
443-
return Validator::new(self.cmd).validate(parse_state, matcher);
460+
return Ok(parse_state);
444461
} else {
445462
// Start error processing
446463
let _ = self.resolve_pending(matcher);
@@ -474,11 +491,7 @@ impl<'cmd> Parser<'cmd> {
474491
ok!(self.parse_subcommand(&sc_name, matcher, raw_args, args_cursor, keep_state));
475492
}
476493

477-
ok!(self.resolve_pending(matcher));
478-
#[cfg(feature = "env")]
479-
ok!(self.add_env(matcher));
480-
ok!(self.add_defaults(matcher));
481-
Validator::new(self.cmd).validate(parse_state, matcher)
494+
Ok(parse_state)
482495
}
483496

484497
fn match_arg_error(

tests/builder/ignore_errors.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ fn unexpected_argument() {
113113
m.get_one::<String>("config").cloned(),
114114
Some("config file".to_owned())
115115
);
116-
assert_eq!(m.get_one::<bool>("unset-flag").copied(), None);
116+
assert_eq!(m.get_one::<bool>("unset-flag").copied(), Some(false));
117117
}
118118

119119
#[test]

0 commit comments

Comments
 (0)