From 8160993b1d42fe4690927e6c48056017772ab4e7 Mon Sep 17 00:00:00 2001 From: David Imola Date: Wed, 25 May 2022 16:35:19 -0600 Subject: [PATCH] Add Overriders --- viper.go | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/viper.go b/viper.go index 655e257..56bb8f4 100644 --- a/viper.go +++ b/viper.go @@ -202,6 +202,8 @@ type Viper struct { // Specific commands for ini parsing iniLoadOptions ini.LoadOptions + overriders []Overrider + automaticEnvApplied bool envKeyReplacer StringReplacer allowEmptyEnv bool @@ -224,6 +226,10 @@ type Viper struct { decoderRegistry *encoding.DecoderRegistry } +type Overrider interface { + Get(lowerCaseKey string) (string, bool) +} + // New returns an initialized Viper instance. func New() *Viper { v := new(Viper) @@ -1280,6 +1286,14 @@ func (v *Viper) find(lcaseKey string, flagDefault bool) interface{} { return nil } + if v.overriders != nil && len(v.overriders) != 0 { + for _, overrider := range v.overriders { + if val, ok := overrider.Get(lcaseKey); ok { + return val + } + } + } + // Env override next if v.automaticEnvApplied { // even if it hasn't been registered, if automaticEnv is used, @@ -1406,6 +1420,16 @@ func (v *Viper) IsSet(key string) bool { return val != nil } +func AddOverrider(o Overrider) { v.AddOverrider(o) } + +func (v *Viper) AddOverrider(o Overrider) { + if v.overriders == nil { + v.overriders = []Overrider{} + } + + v.overriders = append(v.overriders, o) +} + // AutomaticEnv makes Viper check if environment variables match any of the existing keys // (config, default or flags). If matching env vars are found, they are loaded into Viper. func AutomaticEnv() { v.AutomaticEnv() }