Как реализовать OptionFlag с urfave / cli - PullRequest
0 голосов
/ 19 июня 2020

Есть ли способ определить OptionFlag с помощью urfave/cli?

Я ищу что-то похожее на это.

mycli --format json
mycli --format xml

Я знаю, что могу использовать StringFlag , но было бы здорово, если бы я мог показать --help допустимые параметры / значения для этого флага, чтобы он был прозрачен для конечного пользователя mycli.

Таким образом, Flag также может быть проверено на соответствие опциям, чтобы сообщить пользователю, что он предоставил недопустимое значение для этого флага, например, что, конечно, также можно сделать с помощью StringFlag, но лучше было бы что-то более сложное, которое делает все это.

Я также зарегистрировал проблему в репозитории Github. Возможно, это отсутствующая функция, и я был бы рад поделиться ей с некоторыми рекомендациями.

https://github.com/urfave/cli/issues/1154

1 Ответ

0 голосов

Я думаю, вам нужен StringSliceFlag Он позволяет вам определять допустимые / значения по умолчанию для флага.

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/urfave/cli/v2"
)

func main() {

    validMeetings := []string{"standup", "postmortem", "jourfix"}
    meetings := cli.NewStringSlice(validMeetings...)

    app := &cli.App{
        Flags: []cli.Flag{
            &cli.StringSliceFlag{
             Value: meetings,
             Name: "meeting",
             Usage: "use one of the default values"},
        },
        Action: func(c *cli.Context) error {

            m := c.StringSlice("meeting")
            ok := false
            for _, selected := range m {
                for _, valid := range validMeetings {
                    if selected == valid {
                        ok = true
                    }
                }
            }
            if !ok {
                return fmt.Errorf("you must use one of %v", validMeetings)
            }

            fmt.Printf("%s\n", c.String("meeting"))
            return nil
        },
    }

    err := app.Run(os.Args)
    if err != nil {
        log.Fatal(err)
    }
}

https://github.com/urfave/cli/blob/4f74020d9f07911f0fdb8facbc1f557a12cd2a93/app_test.go#L760

...