Getting started

master
Bel LaPointe 2019-03-22 14:16:07 -06:00
commit 4c4746031d
3 changed files with 138 additions and 0 deletions

50
arg.go Normal file
View File

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

78
argset.go Normal file
View File

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

10
type.go Normal file
View File

@ -0,0 +1,10 @@
package args
type Type int
const (
INT = Type(iota)
STRING = Type(iota)
BOOL = Type(iota)
DURATION = Type(iota)
)