Skip to content

Commit f37c746

Browse files
authored
refactor: options can accpet last single dash value (#342)
1 parent b4996ff commit f37c746

File tree

3 files changed

+23
-9
lines changed

3 files changed

+23
-9
lines changed

src/build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ _argc_take_args() {
2424
while [[ $_argc_take_index -lt $_argc_len ]]; do
2525
_argc_take_value="${argc__args[_argc_take_index]}"
2626
if [[ -n "$signs" ]] && [[ "$_argc_take_value" =~ ^["$signs"] ]]; then
27-
if [[ "${#_argc_take_value}" -gt 1 ]] || [[ "$_argc_take_index" == $(($_argc_len - 1)) ]]; then
27+
if [[ "${#_argc_take_value}" -gt 1 ]]; then
2828
break
2929
fi
3030
fi

src/matcher.rs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ impl<'a, 'b, T: Runtime> Matcher<'a, 'b, T> {
184184
&mut split_last_arg_at,
185185
combine_shorts,
186186
&signs,
187+
compgen,
187188
);
188189
comp_option = Some(param.id());
189190
} else if let Some(subcmd) = find_subcommand(cmd, arg, &positional_args)
@@ -240,6 +241,7 @@ impl<'a, 'b, T: Runtime> Matcher<'a, 'b, T> {
240241
&mut split_last_arg_at,
241242
combine_shorts,
242243
&signs,
244+
compgen,
243245
);
244246
comp_option = Some(param.id());
245247
}
@@ -1181,6 +1183,7 @@ fn take_value_args<'a>(
11811183
len: usize,
11821184
signs: &str,
11831185
assigned: bool,
1186+
compgen: bool,
11841187
) -> Vec<&'a str> {
11851188
let mut output = vec![];
11861189
if assigned || len == 0 {
@@ -1189,7 +1192,9 @@ fn take_value_args<'a>(
11891192
let args_len = args.len();
11901193
let end = (start + len).min(args_len);
11911194
for (i, arg) in args.iter().enumerate().take(end).skip(start) {
1192-
if arg.starts_with(|c| signs.contains(c)) && (arg.len() > 1 || i == args_len - 1) {
1195+
if arg.starts_with(|c| signs.contains(c))
1196+
&& (arg.len() > 1 || (compgen && i == args_len - 1))
1197+
{
11931198
break;
11941199
}
11951200
output.push(arg.as_str());
@@ -1239,6 +1244,7 @@ fn match_flag_option<'a, 'b>(
12391244
split_last_arg_at: &mut Option<usize>,
12401245
combine_shorts: bool,
12411246
signs: &str,
1247+
compgen: bool,
12421248
) {
12431249
let arg = &args[*arg_index];
12441250
if param.terminated() {
@@ -1252,7 +1258,7 @@ fn match_flag_option<'a, 'b>(
12521258
} else if let Some(prefix) = param.match_prefix(arg) {
12531259
let args_len = args.len();
12541260
let prefix_len = prefix.len();
1255-
let value_args = take_value_args(args, *arg_index + 1, 1, signs, param.assigned());
1261+
let value_args = take_value_args(args, *arg_index + 1, 1, signs, param.assigned(), compgen);
12561262
let take_empty = value_args.is_empty();
12571263
*arg_index += value_args.len();
12581264
let values = if take_empty { vec!["1"] } else { value_args };
@@ -1266,7 +1272,14 @@ fn match_flag_option<'a, 'b>(
12661272
} else {
12671273
let values_max = param.num_args().1;
12681274
let args_len = args.len();
1269-
let value_args = take_value_args(args, *arg_index + 1, values_max, signs, param.assigned());
1275+
let value_args = take_value_args(
1276+
args,
1277+
*arg_index + 1,
1278+
values_max,
1279+
signs,
1280+
param.assigned(),
1281+
compgen,
1282+
);
12701283
*arg_index += value_args.len();
12711284
if *arg_index == args_len - 1 {
12721285
if *arg_comp != ArgComp::FlagOrOption {

tests/snapshots/integration__spec__option_single_dash.snap

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,14 @@ expression: data
66
prog --oa -
77

88
# OUTPUT
9-
command cat >&2 <<-'EOF'
10-
error: incorrect number of values for `--oa <OA>`
11-
EOF
12-
exit 1
9+
argc_oa=-
10+
argc__args=( prog --oa - )
11+
argc__positionals=( )
1312

1413
# RUN_OUTPUT
15-
error: incorrect number of values for `--oa <OA>`
14+
argc__args=([0]="prog" [1]="--oa" [2]="-")
15+
argc__positionals=()
16+
argc_oa=-
1617

1718
************ RUN ************
1819
prog --oa -

0 commit comments

Comments
 (0)