Restricting arg values in Go
16 Apr 2021
Using the flag.Value
interface is a nice way of offloading
flag parsing to each flag type, and keeping the main function tidier. Here's
an example:
// ConsoleType is a type that implements the flag.Value interface of String() and Set(string) type ConsoleType string func (s *ConsoleType) String() string { return string(*s) } func (s *ConsoleType) Set(value string) error { if !(value == "XBox" || value == "PlayStation" || value == "Wii") { return fmt.Errorf(`"%s" is not one of "XBox", "PlayStation", or "Wii"`, value) } *s = ConsoleType(value) return nil } func main() { var consoleType ConsoleType = ConsoleType("XBox") flag.Var(&consoleType, "placetype", `One of "XBox", "PlayStation", or "Wii"`) flag.Parse() fmt.Printf("Console type is %s\n", consoleType.String()) }
One could imagine doing this for dates (where the command-line string needs to be parsed) and all kinds of other stuff.