docxTemplater/getenv.go

54 lines
1.0 KiB
Go
Raw Permalink Normal View History

package main
import (
"errors"
"os"
"reflect"
"strconv"
"strings"
)
func getEnv(mask interface{}) Env {
r := reflect.ValueOf(mask)
argTypeRV := reflect.New(r.Type())
for i := 0; i < r.NumField(); i++ {
v := r.Type().Field(i).Tag.Get("env")
d := r.Type().Field(i).Tag.Get("default")
env, ok := os.LookupEnv(v)
var val string
if ok {
val = env
} else {
val = d
}
switch t := r.Type().Field(i).Type.String(); t {
case "string":
argTypeRV.Elem().Field(i).SetString(val)
case "[]string":
divider := ","
arr := strings.Split(val, divider)
argTypeRV.Elem().Field(i).Set(reflect.ValueOf(arr))
case "bool":
if strings.EqualFold(val, "true") {
argTypeRV.Elem().Field(i).SetBool(true)
} else {
argTypeRV.Elem().Field(i).SetBool(false)
}
case "uint64":
num, err := strconv.ParseUint(val, 10, 64)
if err != nil {
panic(err)
}
argTypeRV.Elem().Field(i).SetUint(num)
default:
panic(errors.New("Something strange happened: " + t))
}
}
return argTypeRV.Elem().Interface().(Env)
}