forked from extern/nushell
Allow arguments for the last flag in short flag batch (#8808)
# Description _Fixes #5923_ Currently `nushell` doesn't allow short flag batches to contain arguments, despite this being a common pattern in commands like `git commit -am 'My commit message'`. This PR relaxes this so that the last flag in the batch can take an argument. # User-Facing Changes - `nu::parser::short_flag_arg_cant_take_arg` has been replaced by `nu::parser::only_last_flag_in_batch_can_take_arg` and is displayed when a flag other then the last in a short flag batch takes an argument. # Tests + Formatting - Both [`test_parser.rs`](48af0ebc3c/crates/nu-parser/tests/test_parser.rs (L640-L704)
) and [`test_known_external.rs`](48af0ebc3c/src/tests/test_known_external.rs (L42-L61)
) have been updated to test the new allowed and disallowed scenarios. --------- Co-authored-by: sholderbach <sholderbach@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
fff4de5c44
commit
1d68c48a92
@ -455,19 +455,19 @@ fn parse_short_flags(
|
||||
if let Ok(arg_contents_uft8_ref) = str::from_utf8(arg_contents) {
|
||||
if arg_contents_uft8_ref.starts_with('-') && arg_contents_uft8_ref.len() > 1 {
|
||||
let short_flags = &arg_contents_uft8_ref[1..];
|
||||
let num_chars = short_flags.chars().count();
|
||||
let mut found_short_flags = vec![];
|
||||
let mut unmatched_short_flags = vec![];
|
||||
for short_flag in short_flags.char_indices() {
|
||||
let short_flag_char = short_flag.1;
|
||||
let orig = arg_span;
|
||||
for (offset, short_flag) in short_flags.char_indices() {
|
||||
let short_flag_span = Span::new(
|
||||
orig.start + 1 + short_flag.0,
|
||||
orig.start + 1 + short_flag.0 + short_flag_char.len_utf8(),
|
||||
arg_span.start + 1 + offset,
|
||||
arg_span.start + 1 + offset + short_flag.len_utf8(),
|
||||
);
|
||||
if let Some(flag) = sig.get_short_flag(short_flag_char) {
|
||||
// If we require an arg and are in a batch of short flags, error
|
||||
if !found_short_flags.is_empty() && flag.arg.is_some() {
|
||||
working_set.error(ParseError::ShortFlagBatchCantTakeArg(short_flag_span));
|
||||
if let Some(flag) = sig.get_short_flag(short_flag) {
|
||||
// Allow args in short flag batches as long as it is the last flag.
|
||||
if flag.arg.is_some() && offset < num_chars - 1 {
|
||||
working_set
|
||||
.error(ParseError::OnlyLastFlagInBatchCanTakeArg(short_flag_span));
|
||||
break;
|
||||
}
|
||||
found_short_flags.push(flag);
|
||||
|
Reference in New Issue
Block a user