79 lines
1.3 KiB
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")
|
|
}
|