mirror of
https://github.com/spf13/viper
synced 2025-05-11 22:57:21 +00:00
Abstract the validation process as a method.
This commit is contained in:
parent
4bb20e2c5a
commit
c5284b5b3e
1 changed files with 48 additions and 43 deletions
55
viper.go
55
viper.go
|
@ -484,9 +484,37 @@ func (v *Viper) WatchConfig() {
|
||||||
log.Printf("error reading config file: %v\n", err)
|
log.Printf("error reading config file: %v\n", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
v.updateRegisteredConfig(tempViper)
|
||||||
|
|
||||||
|
if v.onConfigChange != nil {
|
||||||
|
v.onConfigChange(event)
|
||||||
|
}
|
||||||
|
} else if filepath.Clean(event.Name) == configFile && event.Has(fsnotify.Remove) {
|
||||||
|
eventsWG.Done()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
case err, ok := <-watcher.Errors:
|
||||||
|
if ok { // 'Errors' channel is not closed
|
||||||
|
log.Printf("watcher error: %v\n", err)
|
||||||
|
}
|
||||||
|
eventsWG.Done()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
watcher.Add(configDir)
|
||||||
|
initWG.Done() // done initializing the watch in this go routine, so the parent routine can move on...
|
||||||
|
eventsWG.Wait() // now, wait for event loop to end in this go-routine...
|
||||||
|
}()
|
||||||
|
initWG.Wait() // make sure that the go routine above fully ended before returning
|
||||||
|
}
|
||||||
|
|
||||||
|
// updateRegisteredConfig validate the registered config items in the new config, notify user with the hook functions.
|
||||||
|
func (v *Viper) updateRegisteredConfig(newConfigViper *Viper) {
|
||||||
for key, config := range v.registered {
|
for key, config := range v.registered {
|
||||||
oldValue := v.Get(key)
|
oldValue := v.Get(key)
|
||||||
newValue := tempViper.Get(key)
|
newValue := newConfigViper.Get(key)
|
||||||
// Check exist
|
// Check exist
|
||||||
if newValue == nil && !config.CanBeNil {
|
if newValue == nil && !config.CanBeNil {
|
||||||
if config.OnUpdateFailed != nil {
|
if config.OnUpdateFailed != nil {
|
||||||
|
@ -500,7 +528,7 @@ func (v *Viper) WatchConfig() {
|
||||||
|
|
||||||
// Type check & convert
|
// Type check & convert
|
||||||
newValueJson, _ := js.Marshal(newValue)
|
newValueJson, _ := js.Marshal(newValue)
|
||||||
err = js.Unmarshal(newValueJson, config.Schema)
|
err := js.Unmarshal(newValueJson, config.Schema)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
config.OnUpdateFailed(&Event{
|
config.OnUpdateFailed(&Event{
|
||||||
old: oldValue,
|
old: oldValue,
|
||||||
|
@ -527,29 +555,6 @@ func (v *Viper) WatchConfig() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if v.onConfigChange != nil {
|
|
||||||
v.onConfigChange(event)
|
|
||||||
}
|
|
||||||
} else if filepath.Clean(event.Name) == configFile && event.Has(fsnotify.Remove) {
|
|
||||||
eventsWG.Done()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
case err, ok := <-watcher.Errors:
|
|
||||||
if ok { // 'Errors' channel is not closed
|
|
||||||
log.Printf("watcher error: %v\n", err)
|
|
||||||
}
|
|
||||||
eventsWG.Done()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
watcher.Add(configDir)
|
|
||||||
initWG.Done() // done initializing the watch in this go routine, so the parent routine can move on...
|
|
||||||
eventsWG.Wait() // now, wait for event loop to end in this go-routine...
|
|
||||||
}()
|
|
||||||
initWG.Wait() // make sure that the go routine above fully ended before returning
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetConfigFile explicitly defines the path, name and extension of the config file.
|
// SetConfigFile explicitly defines the path, name and extension of the config file.
|
||||||
|
|
Loading…
Add table
Reference in a new issue