91 lines
1.8 KiB
Go
91 lines
1.8 KiB
Go
package flag
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/posener/complete"
|
|
)
|
|
|
|
// -- EnumVar and enumValue
|
|
type EnumVar struct {
|
|
Name string
|
|
Aliases []string
|
|
Usage string
|
|
Values []string
|
|
Default []string
|
|
Hidden bool
|
|
EnvVar string
|
|
Target *[]string
|
|
Completion complete.Predictor
|
|
}
|
|
|
|
func (f *Set) EnumVar(i *EnumVar) {
|
|
initial := i.Default
|
|
if v, exist := os.LookupEnv(i.EnvVar); exist {
|
|
parts := strings.Split(v, ",")
|
|
for i := range parts {
|
|
parts[i] = strings.TrimSpace(parts[i])
|
|
}
|
|
initial = parts
|
|
}
|
|
|
|
def := ""
|
|
if i.Default != nil {
|
|
def = strings.Join(i.Default, ",")
|
|
}
|
|
|
|
possible := strings.Join(i.Values, ", ")
|
|
|
|
f.VarFlag(&VarFlag{
|
|
Name: i.Name,
|
|
Aliases: i.Aliases,
|
|
Usage: strings.TrimRight(i.Usage, ". \t") + ". One possible value from: " + possible + ".",
|
|
Default: def,
|
|
EnvVar: i.EnvVar,
|
|
Value: newEnumValue(i, initial, i.Target, i.Hidden),
|
|
Completion: i.Completion,
|
|
})
|
|
}
|
|
|
|
type enumValue struct {
|
|
ev *EnumVar
|
|
hidden bool
|
|
target *[]string
|
|
}
|
|
|
|
func newEnumValue(ev *EnumVar, def []string, target *[]string, hidden bool) *enumValue {
|
|
*target = def
|
|
return &enumValue{
|
|
ev: ev,
|
|
hidden: hidden,
|
|
target: target,
|
|
}
|
|
}
|
|
|
|
func (s *enumValue) Set(vals string) error {
|
|
parts := strings.Split(vals, ",")
|
|
|
|
parts:
|
|
for _, val := range parts {
|
|
val = strings.TrimSpace(val)
|
|
|
|
for _, p := range s.ev.Values {
|
|
if p == val {
|
|
*s.target = append(*s.target, strings.TrimSpace(val))
|
|
continue parts
|
|
}
|
|
}
|
|
|
|
return fmt.Errorf("'%s' not valid. Must be one of: %s", val, strings.Join(s.ev.Values, ", "))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *enumValue) Get() interface{} { return *s.target }
|
|
func (s *enumValue) String() string { return strings.Join(*s.target, ",") }
|
|
func (s *enumValue) Example() string { return "string" }
|
|
func (s *enumValue) Hidden() bool { return s.hidden }
|