From 4c4746031dc9641307ea4e6923d0e8e35110a3b7 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Fri, 22 Mar 2019 14:16:07 -0600 Subject: [PATCH] Getting started --- arg.go | 50 +++++++++++++++++++++++++++++++++++ argset.go | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ type.go | 10 +++++++ 3 files changed, 138 insertions(+) create mode 100644 arg.go create mode 100644 argset.go create mode 100644 type.go diff --git a/arg.go b/arg.go new file mode 100644 index 0000000..b452f11 --- /dev/null +++ b/arg.go @@ -0,0 +1,50 @@ +package args + +import "time" + +type Arg struct { + Env string + Flag string + Help string + Default interface{} + Value interface{} + ArgType Type +} + +func NewArg(argType Type, key, help string, def interface{}) *Arg { + return &Arg{ + Env: key, + Flag: key, + Help: help, + Default: def, + ArgType: argType, + } +} + +func (a *Arg) GetInt(key string) int { + if a.ArgType != INT { + return -1 + } + return a.Value.(int) +} + +func (a *Arg) GetString(key string) string { + if a.ArgType != STRING { + return "" + } + return a.Value.(string) +} + +func (a *Arg) GetBool(key string) bool { + if a.ArgType != BOOL { + return false + } + return a.Value.(bool) +} + +func (a *Arg) GetDuration(key string) time.Duration { + if a.ArgType != DURATION { + return time.Duration(0) + } + return a.Value.(time.Duration) +} diff --git a/argset.go b/argset.go new file mode 100644 index 0000000..74d0c47 --- /dev/null +++ b/argset.go @@ -0,0 +1,78 @@ +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") +} diff --git a/type.go b/type.go new file mode 100644 index 0000000..c9f41cf --- /dev/null +++ b/type.go @@ -0,0 +1,10 @@ +package args + +type Type int + +const ( + INT = Type(iota) + STRING = Type(iota) + BOOL = Type(iota) + DURATION = Type(iota) +)