2014-11-10 04:07:02 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"os"
|
|
|
|
"reflect"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
2018-12-20 11:30:42 +02:00
|
|
|
// EnvOptions holds program options loaded from the process environment
|
2014-11-15 06:06:07 +02:00
|
|
|
type EnvOptions map[string]interface{}
|
|
|
|
|
2018-12-20 11:30:42 +02:00
|
|
|
// LoadEnvForStruct loads environment variables for each field in an options
|
|
|
|
// struct passed into it.
|
|
|
|
//
|
|
|
|
// Fields in the options struct must have an `env` and `cfg` tag to be read
|
|
|
|
// from the environment
|
2014-11-15 06:06:07 +02:00
|
|
|
func (cfg EnvOptions) LoadEnvForStruct(options interface{}) {
|
2014-11-10 04:07:02 +02:00
|
|
|
val := reflect.ValueOf(options).Elem()
|
|
|
|
typ := val.Type()
|
|
|
|
for i := 0; i < typ.NumField(); i++ {
|
|
|
|
// pull out the struct tags:
|
|
|
|
// flag - the name of the command line flag
|
|
|
|
// deprecated - (optional) the name of the deprecated command line flag
|
|
|
|
// cfg - (optional, defaults to underscored flag) the name of the config file option
|
|
|
|
field := typ.Field(i)
|
|
|
|
flagName := field.Tag.Get("flag")
|
|
|
|
envName := field.Tag.Get("env")
|
|
|
|
cfgName := field.Tag.Get("cfg")
|
|
|
|
if cfgName == "" && flagName != "" {
|
|
|
|
cfgName = strings.Replace(flagName, "-", "_", -1)
|
|
|
|
}
|
|
|
|
if envName == "" || cfgName == "" {
|
|
|
|
// resolvable fields must have the `env` and `cfg` struct tag
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
v := os.Getenv(envName)
|
|
|
|
if v != "" {
|
|
|
|
cfg[cfgName] = v
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|