50 lines
966 B
Go
50 lines
966 B
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"bitbucket.org/BlackBroker/heruvym/app"
|
||
|
"errors"
|
||
|
"os"
|
||
|
"reflect"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
func getEnv() app.Options {
|
||
|
var res app.Options
|
||
|
|
||
|
r := reflect.ValueOf(res)
|
||
|
for i := 0; i < r.NumField(); i++ {
|
||
|
v := r.Type().Field(i).Tag.Get(app.ENV)
|
||
|
d := r.Type().Field(i).Tag.Get(app.DEFAULT)
|
||
|
|
||
|
env, ok := os.LookupEnv(v)
|
||
|
var val string
|
||
|
if ok {
|
||
|
val = env
|
||
|
} else {
|
||
|
val = d
|
||
|
}
|
||
|
|
||
|
switch t := r.Type().Field(i).Type.Name(); t {
|
||
|
case "string":
|
||
|
reflect.ValueOf(&res).Elem().Field(i).SetString(val)
|
||
|
case "bool":
|
||
|
if strings.ToLower(val) == "true" {
|
||
|
reflect.ValueOf(&res).Elem().Field(i).SetBool(true)
|
||
|
} else {
|
||
|
reflect.ValueOf(&res).Elem().Field(i).SetBool(false)
|
||
|
}
|
||
|
case "uint64":
|
||
|
num, err := strconv.ParseUint(val, 10, 64)
|
||
|
if err != nil {
|
||
|
panic(err)
|
||
|
}
|
||
|
reflect.ValueOf(&res).Elem().Field(i).SetUint(num)
|
||
|
default:
|
||
|
panic(errors.New("Something strange happend: " + t))
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return res
|
||
|
}
|