-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathenvironment.go
72 lines (60 loc) · 2.25 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
65
66
67
68
69
70
71
72
package venom
import (
"os"
"strings"
"unicode"
)
var defaultEnvResolver = &EnvironmentVariableResolver{}
// EnvSeparator is used as the delimiter for separating keys prior to looking
// them up in the current environment.
//
// ie, an EnvSeparator of "_" will result in a lookup for "log.level" searching
// for an environment variable named "LOG_LEVEL".
var EnvSeparator = "_"
// An EnvironmentVariableResolver is a resolver specifically capable of adding
// additional context in the form of a prefix to any loaded environment
// variables
type EnvironmentVariableResolver struct {
Prefix string
Translator KeyTranslator
}
// Resolve is a Resolver implementation which attempts to load the requested
// configuration from an environment variable
func (r *EnvironmentVariableResolver) Resolve(keys []string, _ ConfigMap) (val interface{}, ok bool) {
// copy the keys so we don't negatively impact subsequent lookups
keysCopy := make([]string, len(keys))
copy(keysCopy, keys)
if len(r.Prefix) > 0 {
keysCopy = append([]string{r.Prefix}, keysCopy...)
}
var translator KeyTranslator
if r.Translator == nil {
// If we weren't given a specific translator to use, then use the
// default translator.
translator = DefaultEnvironmentVariableKeyTranslator
} else {
// Otherwise, use the translator that was provided when this resolver
// was created.
translator = r.Translator
}
return os.LookupEnv(toEnvironmentVariable(keysCopy, translator))
}
// The DefaultEnvironmentVariableKeyTranslator is the default KeyTranslator
// used by the EnvironmentVariableResolver.
//
// It is responsible for mapping arbitrary input keys to an environment
// variable to lookup. This is done by converting all characters to upper case.
func DefaultEnvironmentVariableKeyTranslator(b byte) byte {
return byte(unicode.ToUpper(rune(b)))
}
func toEnvironmentVariable(keys []string, translator KeyTranslator) string {
// Convert the input keys into a single environment variable that we can
// perform a lookup on.
key := []byte(strings.Join(keys, EnvSeparator))
// Next, perform any custom translations performed by the KeyTranslator.
for index, char := range key {
key[index] = translator(char)
}
// Finally, return the translated key to the caller.
return string(key)
}