flagtype

Common flag types for slices, enums, maps, URLs, and regular expressions.

import "github.com/pressly/cli/flagtype"

At a glance

Each name links to godoc.

FUNCTIONS
    func StringSlice() flag.Value
    func Enum(allowed ...string) flag.Value
    func EnumDefault(defaultVal string, allowed []string) flag.Value
    func StringMap() flag.Value
    func URL() flag.Value
    func Regexp() flag.Value

Patterns

A command using every type:

cmd := &cli.Command{
    Name: "fetch",
    Flags: cli.FlagsFunc(func(f *flag.FlagSet) {
        f.Var(flagtype.StringSlice(),
            "tag", "add a tag (repeatable)")

        f.Var(flagtype.Enum("json", "yaml", "table"),
            "format", "output format")

        f.Var(flagtype.EnumDefault("sql", []string{"sql", "go"}),
            "type", "migration type")

        f.Var(flagtype.StringMap(),
            "label", "key=value (repeatable)")

        f.Var(flagtype.URL(),
            "endpoint", "API endpoint")

        f.Var(flagtype.Regexp(),
            "match", "filter pattern")
    }),
    Exec: func(ctx context.Context, state *cli.State) error {
        // Values come back as their Go types.
        tags     := state.GetFlag[[]string]("tag")
        format   := state.GetFlag[string]("format")
        migType  := state.GetFlag[string]("type")
        labels   := state.GetFlag[map[string]string]("label")
        endpoint := state.GetFlag[*url.URL]("endpoint")
        re       := state.GetFlag[*regexp.Regexp]("match")

        _, _, _, _, _, _ = tags, format, migType, labels, endpoint, re
        return nil
    },
}
$ fetch --help
Usage:
  fetch [flags]

Flags:
  --endpoint url       API endpoint
  --format enum        output format
  --label stringMap    key=value (repeatable)
  --match regexp       filter pattern
  --tag stringSlice    add a tag (repeatable)
  --type enum          migration type (default: sql)
# Repeatable flags collect every value.
fetch --tag a --tag b --label env=prod --label tier=api