-
Notifications
You must be signed in to change notification settings - Fork 0
/
env.go
137 lines (114 loc) · 2.33 KB
/
env.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
package env
import (
"fmt"
"os"
"strconv"
"strings"
"github.com/pubgo/xerror"
)
var trim = strings.TrimSpace
func Set(key, value string) error {
return os.Setenv(Key(key), value)
}
func Get(names ...string) string {
var val string
GetWith(&val, names...)
return trim(val)
}
func MustGet(names ...string) string {
var val string
GetWith(&val, names...)
xerror.AssertFn(val == "", func() error {
return &xerror.Err{
Msg: "env not found",
Detail: fmt.Sprintf("names=%v", names),
}
})
return trim(val)
}
func GetWith(val *string, names ...string) {
for _, name := range names {
env, ok := Lookup(name)
env = trim(env)
if ok && env != "" {
*val = trim(env)
}
}
}
func GetBoolVal(val *bool, names ...string) {
var dt = trim(Get(names...))
if dt == "" {
return
}
v, err := strconv.ParseBool(dt)
if err != nil {
return
}
*val = v
}
func GetIntVal(val *int, names ...string) {
var dt = trim(Get(names...))
if dt == "" {
return
}
v, err := strconv.Atoi(dt)
if err != nil {
return
}
*val = v
}
func GetFloatVal(val *float64, names ...string) {
var dt = trim(Get(names...))
if dt == "" {
return
}
v, err := strconv.ParseFloat(dt, 32)
if err != nil {
return
}
*val = v
}
func Lookup(key string) (string, bool) {
return os.LookupEnv(Key(key))
}
func UnSetenv(key string) error {
return os.Unsetenv(Key(key))
}
// Expand returns value of convert with environment variable.
// Return environment variable if value start with "${" and end with "}".
// Return default value if environment variable is empty or not exist.
//
// It accepts value formats "${env}" ,"${env||defaultValue}" , "defaultValue".
// Examples:
// _ = Expand("${GOPATH}")
// _ = Expand("${GOPATH||/usr/local/go}")
// _ = Expand("hello")
func Expand(value string) string {
return os.Expand(value, func(s string) string {
vs := strings.SplitN(s, "||", 2)
v := Get(trim(vs[0]))
if len(vs) == 2 && v == "" {
v = trim(vs[1])
}
return v
})
}
func List() map[string]string {
var data = make(map[string]string)
for _, env := range os.Environ() {
envList := strings.SplitN(env, "=", 2)
if len(envList) != 2 {
continue
}
key := trim(envList[0])
val := trim(envList[1])
if key == "" {
continue
}
data[key] = trim(val)
}
return data
}
func Key(key string) string {
return strings.ToUpper(trim(key))
}