-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathenv.go
More file actions
65 lines (55 loc) · 1.54 KB
/
env.go
File metadata and controls
65 lines (55 loc) · 1.54 KB
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
package sys
import (
"os"
"strings"
)
// Env is an interface to a set of environment variables.
type Env interface {
// Get gets the environment variable of the given name.
Get(name string) string
Environ(prefixs []string) map[string]string
}
type realEnv struct{}
func (r realEnv) Get(name string) string {
return os.Getenv(name)
}
func (r realEnv) Environ(prefixs []string) map[string]string {
envs := make(map[string]string)
for _, env := range os.Environ() {
pair := strings.SplitN(env, "=", 2)
for index := range prefixs {
if _, hasKey := envs[pair[0]]; !hasKey && strings.HasPrefix(pair[0], prefixs[index]) {
envs[pair[0]] = pair[1]
}
}
}
return envs
}
// RealEnv returns an Env implementation that uses os.Getenv every time Get is called.
func RealEnv() Env {
return realEnv{}
}
// FakeEnv is an Env implementation that stores the environment in a map.
type FakeEnv struct {
// Envs is the map from which Get calls will look to retrieve environment variables.
Envs map[string]string
}
// NewFakeEnv returns a new FakeEnv with no values in Envs.
func NewFakeEnv() *FakeEnv {
return &FakeEnv{Envs: make(map[string]string)}
}
// Get is the Env interface implementation for Env.
func (f *FakeEnv) Get(name string) string {
return f.Envs[name]
}
func (f *FakeEnv) Environ(prefixs []string) map[string]string {
envs := make(map[string]string)
for key := range f.Envs {
for index := range prefixs {
if _, hasKey := envs[key]; !hasKey && strings.HasPrefix(key, prefixs[index]) {
envs[key] = f.Envs[key]
}
}
}
return envs
}