/
environment.go
64 lines (54 loc) · 1.6 KB
/
environment.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
package config
import (
"os"
"strings"
"github.com/ah-its-andy/downton/core"
)
type EnvironmentConfigurationSource struct {
prefixs []string
}
func (source *EnvironmentConfigurationSource) Build(builder core.ConfigurationBuilder) core.ConfigurationProvider {
return NewEnvironmentConfigurationProvider(source)
}
type EnvironmentConfigurationProvider struct {
ConfigurationProvider
source *EnvironmentConfigurationSource
normalizePrefixs []string
}
func NewEnvironmentConfigurationProvider(source *EnvironmentConfigurationSource) *EnvironmentConfigurationProvider {
ret := &EnvironmentConfigurationProvider{
source: source,
normalizePrefixs: make([]string, len(source.prefixs)),
ConfigurationProvider: *NewConfigurationProvider(),
}
for i, prefix := range source.prefixs {
ret.normalizePrefixs[i] = ret.normalize(prefix)
}
return ret
}
func (provider *EnvironmentConfigurationProvider) Load() {
for _, env := range os.Environ() {
separatorIndex := strings.Index(env, "=")
k, v := "", ""
if separatorIndex < 0 {
k = env
} else {
k = env[separatorIndex:]
v = env[separatorIndex+1:]
}
if provider.includeWithPrefixs(provider.normalize(k)) {
provider.Set(provider.normalize(k), v)
}
}
}
func (provider *EnvironmentConfigurationProvider) includeWithPrefixs(k string) bool {
for _, prefix := range provider.normalizePrefixs {
if strings.HasPrefix(k, prefix) {
return true
}
}
return false
}
func (provider *EnvironmentConfigurationProvider) normalize(k string) string {
return strings.Replace(k, "__", core.DefaultConfigPathKeyDelimiter, -1)
}