Cobra 允许的标志值

Bre*_*ren 10 go go-cobra

Cobra 库中是否有内置工具(如果有,我该如何使用它?)要求标志为多个值之一,并在标志不是允许的值之一时抛出错误?我在 Github 页面上没有看到这个。

App*_*jag 23

Cobra 允许您通过该方法定义要用作标志的自定义值类型pflag.(*FlagSet).Var()(来自Cobra 使用的https://github.com/spf13/pflag包)。您必须创建一个实现该pflag.Value接口的新类型:

type Value interface {
    String() string
    Set(string) error
    Type() string
}
Run Code Online (Sandbox Code Playgroud)

类型定义示例:

type myEnum string

const (
    myEnumFoo myEnum = "foo"
    myEnumBar myEnum = "bar"
    myEnumMoo myEnum = "moo"
)

// String is used both by fmt.Print and by Cobra in help text
func (e *myEnum) String() string {
    return string(*e)
}

// Set must have pointer receiver so it doesn't change the value of a copy
func (e *myEnum) Set(v string) error {
    switch v {
    case "foo", "bar", "moo":
        *e = myEnum(v)
        return nil
    default:
        return errors.New(`must be one of "foo", "bar", or "moo"`)
    }
}

// Type is only used in help text
func (e *myEnum) Type() string {
    return "myEnum"
}
Run Code Online (Sandbox Code Playgroud)

注册示例:

func init() {
    var flagMyEnum = myEnumFoo

    var myCmd = &cobra.Command{
        Use:   "mycmd",
        Short: "A brief description of your command",
        Run: func(cmd *cobra.Command, args []string) {
            fmt.Println("myenum value:", flagMyEnum)
        },
    }

    rootCmd.AddCommand(myCmd)

    myCmd.Flags().Var(&flagMyEnum, "myenum", `my custom enum. allowed: "foo", "bar", "moo"`)
}
Run Code Online (Sandbox Code Playgroud)

用法示例:(注意下面控制台输出中的第一行)

$ go run . mycmd --myenum raz
Error: invalid argument "raz" for "--myenum" flag: must be one of "foo", "bar", or "moo"
Usage:
  main mycmd [flags]

Flags:
  -h, --help            help for mycmd
      --myenum myEnum   my custom enum. allowed: "foo", "bar", "moo" (default foo)

exit status 1
Run Code Online (Sandbox Code Playgroud)
$ go run . mycmd --myenum bar
myenum value: bar
Run Code Online (Sandbox Code Playgroud)

竣工数量

要添加自动补全功能,有点隐藏的文档页面cobra/shell_completions.md#completions-for-flags非常有帮助。对于我们的示例,您可以添加如下内容:

$ go run . mycmd --myenum raz
Error: invalid argument "raz" for "--myenum" flag: must be one of "foo", "bar", or "moo"
Usage:
  main mycmd [flags]

Flags:
  -h, --help            help for mycmd
      --myenum myEnum   my custom enum. allowed: "foo", "bar", "moo" (default foo)

exit status 1
Run Code Online (Sandbox Code Playgroud)

用法示例:

$ go build -o main .

$ source <(main completion bash)

$ main mycmd --myenum <TAB><TAB>
bar  (help text for bar)
foo  (help text for foo)
moo  (help text for moo)
Run Code Online (Sandbox Code Playgroud)

  • @red888 是的, `flagMyEnum = myEnumFoo` 设置默认值。pflag `.Var()` 函数使用您作为第一个参数传入的值作为默认值。关于第二个问题:还有一个“.VarP()”函数提供一个短标志,与“StringVarP()”相同 (2认同)

Bre*_*ren -1

尽管很难证明是否定的,但目前看来这并不是一个功能。