args/argset.go

79 lines
1.3 KiB
Go

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")
}