From 3d78e41e347ea26f09f09eed613d613d804e9c16 Mon Sep 17 00:00:00 2001 From: nhyatt Date: Tue, 7 Nov 2023 07:23:32 -0600 Subject: [PATCH] switches getEnv to generic --- internal/config/envconfig.go | 114 +++++++++++++---------------------- 1 file changed, 43 insertions(+), 71 deletions(-) diff --git a/internal/config/envconfig.go b/internal/config/envconfig.go index befa0bb..58f9438 100644 --- a/internal/config/envconfig.go +++ b/internal/config/envconfig.go @@ -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 }