package args import ( "errors" "os" ) type ArgSet struct { parsed bool args []*Arg } func NewArgSet() *ArgSet { return &ArgSet{ args: []*Arg{}, } } func (as *ArgSet) Append(argType Type, key, help string, def interface{}) { as.args = append(as.args, NewArg(argType, key, help, def)) } func (as *ArgSet) Get(key string) *Arg { if !as.parsed { return nil } for i := range as.args { if as.args[i].Key == key { return as[i] } } return nil } func (as *ArgSet) Parse() error { if as.parsed { return nil } defer func() { as.parsed = true }() if err := as.setValueFromDefaults(); err != nil { return err } if err := as.setValueFromEnv(); err != nil { return err } if err := as.setValueFromFlag(); err != nil { return err } return nil } func (as *ArgSet) setValueFromDefaults() error { // TODO if not casted type, return err for i := range as.args { args[i].Value = args[i].Default } return nil } func (as *ArgSet) setValueFromEnv() error { // TODO if not casted type, return err for i := range as.args { key := args[i].Key if v, ok := os.LookupEnv(key); ok { args[i].Value = v } } return nil } func (as *ArgSet) setValueFromFlags() error { // TODO if not casted type, return err return errors.New("not impl") }