urfave / cli

A simple, fast, and fun package for building command line apps in Go

Home Page:https://cli.urfave.org

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[v3] `Validator` seems to always receive the empty string

zx8 opened this issue · comments

commented

Info:

  • Using v3.0.0-alpha7

Code

package main

import (
  "context"
  "fmt"
  "log"
  "os"
  "slices"

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

func main() {
  cmd := &cli.Command{
    Name: "example",
    Flags: []cli.Flag{
      &cli.StringFlag{
        Name: "foo",
        Validator: func(s string) error {
          allowed := []string{"a", "b", "c"}
          if slices.Contains(allowed, s) {
            return nil
          }
          return fmt.Errorf("foo must be one of %s, not [%s]", allowed, s)
        },
      },
    },
  }

  if err := cmd.Run(context.Background(), os.Args); err != nil {
    log.Fatal(err)
  }
}

Expected

$ go run . --foo=a
<no error>

Actual

$ go run . --foo=a
foo must be one of [a b c], not []

@zx8 I see the issue. It is trying to validate the "default" value which in your case is "" since nothing is set. Can you set StringFlag.Value to "a"(say) and see what happens ?

commented

@dearchap You are correct. It seems to be validating the default rather than the supplied value.

No it valids default value and if that succeeds then does the supplied value.

commented

Aha, ok. I'll add the default to the validator then! Thanks.