Merge pull request #7 from DataDog/albertvaka/poc-config-schema

Enable storing a set of known valid config keys
This commit is contained in:
Albert Vaca 2019-04-23 17:53:20 +02:00 committed by GitHub
commit 0d6ea091c7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 48 additions and 0 deletions

View file

@ -196,6 +196,7 @@ type Viper struct {
pflags map[string]FlagValue
env map[string]string
aliases map[string]string
knownKeys map[string]interface{}
typeByDefValue bool
// Store read properties on the object so that we can write back in order with comments.
@ -218,6 +219,7 @@ func New() *Viper {
v.pflags = make(map[string]FlagValue)
v.env = make(map[string]string)
v.aliases = make(map[string]string)
v.knownKeys = make(map[string]interface{})
v.typeByDefValue = false
return v
@ -1036,6 +1038,8 @@ func (v *Viper) BindEnv(input ...string) error {
v.env[key] = envkey
v.SetKnown(key)
return nil
}
@ -1233,6 +1237,7 @@ func (v *Viper) registerAlias(alias string, key string) {
} else {
jww.WARN.Println("Creating circular reference alias", alias, key, v.realKey(key))
}
v.SetKnown(alias)
}
func (v *Viper) realKey(key string) string {
@ -1269,6 +1274,29 @@ func (v *Viper) SetDefault(key string, value interface{}) {
// set innermost value
deepestMap[lastKey] = value
v.SetKnown(key)
}
// SetKnown adds a key to the set of known valid config keys
func SetKnown(key string) { v.SetKnown(key) }
func (v *Viper) SetKnown(key string) {
key = strings.ToLower(key)
splitPath := strings.Split(key, v.keyDelim)
for j := range splitPath {
subKey := strings.Join(splitPath[:j+1], v.keyDelim)
v.knownKeys[subKey] = struct{}{}
}
}
// GetKnownKeys returns all the keys that meet at least one of these criteria:
// 1) have a default, 2) have an environment variable binded, 3) are an alias or 4) have been SetKnown()
func GetKnownKeys() map[string]interface{} { return v.GetKnownKeys() }
func (v *Viper) GetKnownKeys() map[string]interface{} {
ret := make(map[string]interface{})
for key, value := range v.knownKeys {
ret[key] = value
}
return ret
}
// Set sets the value for the key in the override register.

View file

@ -1766,3 +1766,23 @@ func BenchmarkGetBoolFromMap(b *testing.B) {
}
}
}
func TestKnownKeys(t *testing.T) {
v := New()
v.SetDefault("default", 45)
if _, ok := v.GetKnownKeys()["default"]; !ok {
t.Error("SetDefault didn't mark key as known")
}
v.BindEnv("bind", "my_env_var")
if _, ok := v.GetKnownKeys()["bind"]; !ok {
t.Error("BindEnv didn't mark key as known")
}
v.RegisterAlias("my_alias", "key")
if _, ok := v.GetKnownKeys()["my_alias"]; !ok {
t.Error("RegisterAlias didn't mark alias as known")
}
v.SetKnown("known")
if _, ok := v.GetKnownKeys()["known"]; !ok {
t.Error("SetKnown didn't mark key as known")
}
}