From 8c2f7901aab707654614e01f245fb4b5376cbad6 Mon Sep 17 00:00:00 2001 From: div72 <60045611+div72@users.noreply.github.com> Date: Wed, 11 Aug 2021 12:26:17 +0300 Subject: [PATCH] cli: have a posix mode to handle -- (#11133) --- vlib/cli/command.v | 10 ++++++---- vlib/cli/command_test.v | 1 + vlib/cli/flag.v | 30 ++++++++---------------------- vlib/cli/help.v | 13 ++++++------- 4 files changed, 21 insertions(+), 33 deletions(-) diff --git a/vlib/cli/command.v b/vlib/cli/command.v index 43940d19b4..d242e00453 100644 --- a/vlib/cli/command.v +++ b/vlib/cli/command.v @@ -28,6 +28,7 @@ pub mut: flags []Flag required_args int args []string + posix_mode bool } // str returns the `string` representation of the `Command`. @@ -103,6 +104,7 @@ pub fn (mut cmd Command) add_command(command Command) { pub fn (mut cmd Command) setup() { for mut subcmd in cmd.commands { subcmd.parent = unsafe { cmd } + subcmd.posix_mode = cmd.posix_mode subcmd.setup() } } @@ -146,11 +148,11 @@ pub fn (mut cmd Command) parse(args []string) { // `-v`/`--version` flags to the `Command`. fn (mut cmd Command) add_default_flags() { if !cmd.disable_help && !cmd.flags.contains('help') { - use_help_abbrev := !cmd.flags.contains('h') && cmd.flags.have_abbrev() + use_help_abbrev := !cmd.flags.contains('h') && cmd.posix_mode cmd.add_flag(help_flag(use_help_abbrev)) } if !cmd.disable_version && cmd.version != '' && !cmd.flags.contains('version') { - use_version_abbrev := !cmd.flags.contains('v') && cmd.flags.have_abbrev() + use_version_abbrev := !cmd.flags.contains('v') && cmd.posix_mode cmd.add_flag(version_flag(use_version_abbrev)) } } @@ -175,10 +177,10 @@ fn (mut cmd Command) parse_flags() { for i in 0 .. cmd.flags.len { unsafe { mut flag := &cmd.flags[i] - if flag.matches(cmd.args, cmd.flags.have_abbrev()) { + if flag.matches(cmd.args, cmd.posix_mode) { found = true flag.found = true - cmd.args = flag.parse(cmd.args, cmd.flags.have_abbrev()) or { + cmd.args = flag.parse(cmd.args, cmd.posix_mode) or { println('Failed to parse flag `${cmd.args[0]}`: $err') exit(1) } diff --git a/vlib/cli/command_test.v b/vlib/cli/command_test.v index aae7199c85..e3c69b1cdb 100644 --- a/vlib/cli/command_test.v +++ b/vlib/cli/command_test.v @@ -85,6 +85,7 @@ fn test_if_flag_gets_set_with_long_arg() { mut cmd := cli.Command{ name: 'command' execute: flag_should_be_set + posix_mode: true } cmd.add_flag(cli.Flag{ flag: .string diff --git a/vlib/cli/flag.v b/vlib/cli/flag.v index be84f6fd1a..fb8fa09d93 100644 --- a/vlib/cli/flag.v +++ b/vlib/cli/flag.v @@ -211,8 +211,8 @@ pub fn (flags []Flag) get_strings(name string) ?[]string { // parse parses flag values from arguments and return // an array of arguments with all consumed elements removed. -fn (mut flag Flag) parse(args []string, with_abbrev bool) ?[]string { - if flag.matches(args, with_abbrev) { +fn (mut flag Flag) parse(args []string, posix_mode bool) ?[]string { + if flag.matches(args, posix_mode) { if flag.flag == .bool { new_args := flag.parse_bool(args) ? return new_args @@ -231,16 +231,12 @@ fn (mut flag Flag) parse(args []string, with_abbrev bool) ?[]string { } // matches returns `true` if first arg in `args` matches this flag. -fn (mut flag Flag) matches(args []string, with_abbrev bool) bool { - if with_abbrev { - return (flag.name != '' && args[0] == '--$flag.name') - || (flag.name != '' && args[0].starts_with('--$flag.name=')) - || (flag.abbrev != '' && args[0] == '-$flag.abbrev') - || (flag.abbrev != '' && args[0].starts_with('-$flag.abbrev=')) - } else { - return (flag.name != '' && args[0] == '-$flag.name') - || (flag.name != '' && args[0].starts_with('-$flag.name=')) - } +fn (mut flag Flag) matches(args []string, posix_mode bool) bool { + prefix := if posix_mode { '--' } else { '-' } + return (flag.name != '' && args[0] == '$prefix$flag.name') + || (flag.name != '' && args[0].starts_with('$prefix$flag.name=')) + || (flag.abbrev != '' && args[0] == '-$flag.abbrev') + || (flag.abbrev != '' && args[0].starts_with('-$flag.abbrev=')) } fn (mut flag Flag) parse_raw(args []string) ?[]string { @@ -289,16 +285,6 @@ fn (flags []Flag) contains(name string) bool { return false } -fn (flags []Flag) have_abbrev() bool { - mut have_abbrev := false - for flag in flags { - if flag.abbrev != '' { - have_abbrev = true - } - } - return have_abbrev -} - // Check if value is set by command line option. If not, return default value. fn (flag Flag) get_value_or_default_value() []string { if flag.value.len == 0 && flag.default_value.len > 0 { diff --git a/vlib/cli/help.v b/vlib/cli/help.v index 6ce3e4156b..6c4ccf5bcb 100644 --- a/vlib/cli/help.v +++ b/vlib/cli/help.v @@ -76,7 +76,7 @@ fn (cmd Command) help_message() string { } mut abbrev_len := 0 mut name_len := cli.min_description_indent_len - if cmd.flags.have_abbrev() { + if cmd.posix_mode { for flag in cmd.flags { abbrev_len = max(abbrev_len, flag.abbrev.len + cli.spacing + 1) // + 1 for '-' in front name_len = max(name_len, abbrev_len + flag.name.len + cli.spacing + 2) // + 2 for '--' in front @@ -96,14 +96,13 @@ fn (cmd Command) help_message() string { help += '\nFlags:\n' for flag in cmd.flags { mut flag_name := '' - if flag.abbrev != '' && cmd.flags.have_abbrev() { + prefix := if cmd.posix_mode { '--' } else { '-' } + if flag.abbrev != '' { abbrev_indent := ' '.repeat(abbrev_len - flag.abbrev.len - 1) // - 1 for '-' in front - flag_name = '-$flag.abbrev$abbrev_indent--$flag.name' - } else if cmd.flags.have_abbrev() { - abbrev_indent := ' '.repeat(abbrev_len) - flag_name = '$abbrev_indent--$flag.name' + flag_name = '-$flag.abbrev$abbrev_indent$prefix$flag.name' } else { - flag_name = '-$flag.name' + abbrev_indent := ' '.repeat(abbrev_len) + flag_name = '$abbrev_indent$prefix$flag.name' } mut required := '' if flag.required {