forked from dtm-labs/dtm
/
config_utils.go
93 lines (86 loc) · 2.31 KB
/
config_utils.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package config
import (
"errors"
"fmt"
"os"
"reflect"
"regexp"
"strings"
"github.com/10antz-inc/pf-dtm/client/dtmcli/dtmimp"
)
func loadFromEnv(prefix string, conf interface{}) {
rv := reflect.ValueOf(conf)
dtmimp.PanicIf(rv.Kind() != reflect.Ptr || rv.IsNil(),
fmt.Errorf("should be a valid pointer, but %s found", reflect.TypeOf(conf).Name()))
loadFromEnvInner(prefix, rv.Elem(), "")
}
func loadFromEnvInner(prefix string, conf reflect.Value, defaultValue string) {
kind := conf.Kind()
switch kind {
case reflect.Struct:
t := conf.Type()
for i := 0; i < t.NumField(); i++ {
tag := t.Field(i).Tag
loadFromEnvInner(prefix+"_"+tag.Get("yaml"), conf.Field(i), tag.Get("default"))
}
case reflect.String:
str := os.Getenv(toUnderscoreUpper(prefix))
if str == "" {
str = defaultValue
}
conf.Set(reflect.ValueOf(str))
case reflect.Int64:
str := os.Getenv(toUnderscoreUpper(prefix))
if str == "" {
str = defaultValue
}
if str == "" {
str = "0"
}
conf.Set(reflect.ValueOf(int64(dtmimp.MustAtoi(str))))
default:
panic(fmt.Errorf("unsupported type: %s", conf.Type().Name()))
}
}
func toUnderscoreUpper(key string) string {
key = strings.Trim(key, "_")
matchLastCap := regexp.MustCompile("([A-Z])([A-Z][a-z])")
s2 := matchLastCap.ReplaceAllString(key, "${1}_${2}")
matchFirstCap := regexp.MustCompile("([a-z])([A-Z]+)")
s2 = matchFirstCap.ReplaceAllString(s2, "${1}_${2}")
// logger.Infof("loading from env: %s", strings.ToUpper(s2))
return strings.ToUpper(s2)
}
func checkConfig(conf *Type) error {
if conf.RetryInterval < 10 {
return errors.New("RetryInterval should not be less than 10")
}
if conf.TimeoutToFail < conf.RetryInterval {
return errors.New("TimeoutToFail should not be less than RetryInterval")
}
switch conf.Store.Driver {
case BoltDb:
return nil
case Mysql, Postgres:
if conf.Store.Host == "" {
return errors.New("Db host not valid ")
}
if conf.Store.Port == 0 {
return errors.New("Db port not valid ")
}
if conf.Store.User == "" {
return errors.New("Db user not valid ")
}
if conf.Store.Schema == "" {
return errors.New("Postgres schema not valid")
}
case Redis:
if conf.Store.Host == "" {
return errors.New("Redis host not valid")
}
if conf.Store.Port == 0 {
return errors.New("Redis port not valid")
}
}
return nil
}