Skip to content

Commit e1db168

Browse files
committed
fix(parser): Ensure terminated positionals are assigned correctly
1 parent 1ee2e95 commit e1db168

File tree

2 files changed

+22
-24
lines changed

2 files changed

+22
-24
lines changed

clap_builder/src/parser/parser.rs

+20-19
Original file line numberDiff line numberDiff line change
@@ -372,26 +372,27 @@ impl<'cmd> Parser<'cmd> {
372372
if matcher.pending_arg_id() != Some(arg.get_id()) || !arg.is_multiple_values_set() {
373373
ok!(self.resolve_pending(matcher));
374374
}
375-
if let Some(_parse_result) = self.check_terminator(arg, arg_os.to_value_os()) {
376-
debug!(
377-
"Parser::get_matches_with: ignoring terminator result {_parse_result:?}"
378-
);
379-
} else {
380-
let arg_values = matcher.pending_values_mut(
381-
arg.get_id(),
382-
Some(Identifier::Index),
383-
trailing_values,
384-
);
385-
arg_values.push(arg_os.to_value_os().to_owned());
386-
}
375+
parse_state =
376+
if let Some(parse_result) = self.check_terminator(arg, arg_os.to_value_os()) {
377+
debug_assert_eq!(parse_result, ParseResult::ValuesDone);
378+
pos_counter += 1;
379+
ParseState::ValuesDone
380+
} else {
381+
let arg_values = matcher.pending_values_mut(
382+
arg.get_id(),
383+
Some(Identifier::Index),
384+
trailing_values,
385+
);
386+
arg_values.push(arg_os.to_value_os().to_owned());
387387

388-
// Only increment the positional counter if it doesn't allow multiples
389-
if !arg.is_multiple() {
390-
pos_counter += 1;
391-
parse_state = ParseState::ValuesDone;
392-
} else {
393-
parse_state = ParseState::Pos(arg.get_id().clone());
394-
}
388+
// Only increment the positional counter if it doesn't allow multiples
389+
if !arg.is_multiple() {
390+
pos_counter += 1;
391+
ParseState::ValuesDone
392+
} else {
393+
ParseState::Pos(arg.get_id().clone())
394+
}
395+
};
395396
valid_arg_found = true;
396397
} else if let Some(external_parser) =
397398
self.cmd.get_external_subcommand_value_parser().cloned()

tests/builder/multiple_values.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -1447,16 +1447,13 @@ fn multiple_positional_multiple_values() {
14471447
.unwrap()
14481448
.map(|v| v.as_str())
14491449
.collect();
1450-
assert_eq!(
1451-
&cmd1,
1452-
&["find", "-type", "f", "-name", "special", "/home/clap"]
1453-
);
1450+
assert_eq!(&cmd1, &["find", "-type", "f", "-name", "special"]);
14541451
let cmd2: Vec<_> = m
14551452
.get_many::<String>("cmd2")
14561453
.unwrap()
14571454
.map(|v| v.as_str())
14581455
.collect();
1459-
assert_eq!(&cmd2, &["foo"]);
1456+
assert_eq!(&cmd2, &["/home/clap", "foo"]);
14601457
}
14611458

14621459
#[test]

0 commit comments

Comments
 (0)