switches getEnv to generic

This commit is contained in:
Hyatt 2023-11-07 07:23:32 -06:00
parent 08f6a4a080
commit 3d78e41e34
Signed by: nhyatt
GPG Key ID: C50D0BBB5BC40BEA

@ -21,79 +21,47 @@ type structInfo struct {
Secret interface{}
}
// getEnvString returns string from environment variable
func getEnvString(env string, def string) string {
func getEnv[t string | bool | int | int64 | float64](env string, def t) (t, error) {
val := os.Getenv(env)
if len(val) == 0 {
return def
}
return ""
}
// getEnvBool returns boolean from environment variable
func getEnvBool(env string, def bool) (bool, error) {
val := os.Getenv(env)
if len(val) == 0 {
return def, nil
}
ret, err := strconv.ParseBool(val)
if err != nil {
return false, fmt.Errorf("Environment variable is not of type bool: %v", env)
output := *new(t)
switch (interface{})(def).(type) {
case string:
v, err := typeConversion("string", val)
if err != nil {
return (interface{})(false).(t), err
}
output = v.(t)
case bool:
v, err := typeConversion("bool", val)
if err != nil {
return (interface{})(false).(t), err
}
output = v.(t)
case int:
v, err := typeConversion("int", val)
if err != nil {
return (interface{})(int(0)).(t), err
}
output = (interface{})(v.(int)).(t)
case int64:
v, err := typeConversion("int64", val)
if err != nil {
return (interface{})(int64(0)).(t), err
}
output = v.(t)
case float64:
v, err := typeConversion("float64", val)
if err != nil {
return (interface{})(float64(0)).(t), err
}
output = v.(t)
}
return ret, nil
}
// getEnvInt returns int from environment variable
func getEnvInt(env string, def int) (int, error) {
val := os.Getenv(env)
if len(val) == 0 {
return def, nil
}
ret, err := strconv.Atoi(val)
if err != nil {
return 0, fmt.Errorf("Environment variable is not of type int: %v", env)
}
return ret, nil
}
// getEnvInt64 return int64 from environment variable
func getEnvInt64(env string, def int64) (int64, error) {
val := os.Getenv(env)
if len(val) == 0 {
return def, nil
}
ret, err := strconv.ParseInt(val, 10, 64)
if err != nil {
return 0, fmt.Errorf("Environment variable is not of type int64: %v", env)
}
return ret, nil
}
// getEnvFloat64 return float64 from environment variable
func getEnvFloat64(env string, def float64) (float64, error) {
val := os.Getenv(env)
if len(val) == 0 {
return def, nil
}
ret, err := strconv.ParseFloat(val, 64)
if err != nil {
return 0, fmt.Errorf("Environment variable is not of type float64: %v", env)
}
return ret, nil
return output, nil
}
func getStructInfo(spec interface{}) ([]structInfo, error) {
@ -213,7 +181,11 @@ func (cfg *Config) parseFlags(cfgInfo []structInfo) error {
dv = info.DefaultValue.(string)
}
p := reflect.ValueOf(cfg).Elem().FieldByName(info.Name).Addr().Interface().(*string)
flag.StringVar(p, info.Name, getEnvString(info.Alt, dv), info.Info)
retVal, err := getEnv(info.Alt, dv)
if err != nil {
return err
}
flag.StringVar(p, info.Name, retVal, info.Info)
case "bool":
var dv bool
@ -221,7 +193,7 @@ func (cfg *Config) parseFlags(cfgInfo []structInfo) error {
dv = info.DefaultValue.(bool)
}
p := reflect.ValueOf(cfg).Elem().FieldByName(info.Name).Addr().Interface().(*bool)
retVal, err := getEnvBool(info.Alt, dv)
retVal, err := getEnv(info.Alt, dv)
if err != nil {
return err
}
@ -233,7 +205,7 @@ func (cfg *Config) parseFlags(cfgInfo []structInfo) error {
dv = int(info.DefaultValue.(int64))
}
p := reflect.ValueOf(cfg).Elem().FieldByName(info.Name).Addr().Interface().(*int)
retVal, err := getEnvInt(info.Alt, dv)
retVal, err := getEnv(info.Alt, dv)
if err != nil {
return err
}
@ -245,7 +217,7 @@ func (cfg *Config) parseFlags(cfgInfo []structInfo) error {
dv = info.DefaultValue.(int64)
}
p := reflect.ValueOf(cfg).Elem().FieldByName(info.Name).Addr().Interface().(*int64)
retVal, err := getEnvInt64(info.Alt, dv)
retVal, err := getEnv(info.Alt, dv)
if err != nil {
return err
}
@ -257,7 +229,7 @@ func (cfg *Config) parseFlags(cfgInfo []structInfo) error {
dv = info.DefaultValue.(float64)
}
p := reflect.ValueOf(cfg).Elem().FieldByName(info.Name).Addr().Interface().(*float64)
retVal, err := getEnvFloat64(info.Alt, dv)
retVal, err := getEnv(info.Alt, dv)
if err != nil {
return err
}