mirror of
https://github.com/safing/portbase
synced 2025-09-01 10:09:50 +00:00
Allow errors from loadUnmappedValue to be "soft" errors. Signal config changes when loading unmapped values
This commit is contained in:
parent
34453d6989
commit
f423570475
2 changed files with 23 additions and 8 deletions
|
@ -104,29 +104,43 @@ func Register(option *Option) error {
|
||||||
return fmt.Errorf("config: invalid default value: %w", vErr)
|
return fmt.Errorf("config: invalid default value: %w", vErr)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := loadUnmappedValue(option); err != nil {
|
hasUnmappedValue, vErr := loadUnmappedValue(option)
|
||||||
return err
|
if vErr != nil && !vErr.SoftError {
|
||||||
|
return fmt.Errorf("config: invalid value: %w", vErr)
|
||||||
}
|
}
|
||||||
|
|
||||||
optionsLock.Lock()
|
optionsLock.Lock()
|
||||||
defer optionsLock.Unlock()
|
defer optionsLock.Unlock()
|
||||||
options[option.Key] = option
|
options[option.Key] = option
|
||||||
|
|
||||||
return nil
|
if hasUnmappedValue {
|
||||||
|
signalChanges()
|
||||||
|
}
|
||||||
|
|
||||||
|
// return the validation-error from loadUnmappedValue here
|
||||||
|
return vErr
|
||||||
}
|
}
|
||||||
|
|
||||||
func loadUnmappedValue(option *Option) error {
|
func loadUnmappedValue(option *Option) (bool, *ValidationError) {
|
||||||
unmappedValuesLock.Lock()
|
unmappedValuesLock.Lock()
|
||||||
defer unmappedValuesLock.Unlock()
|
defer unmappedValuesLock.Unlock()
|
||||||
|
|
||||||
if value, ok := unmappedValues[option.Key]; ok {
|
if value, ok := unmappedValues[option.Key]; ok {
|
||||||
delete(unmappedValues, option.Key)
|
delete(unmappedValues, option.Key)
|
||||||
|
|
||||||
var vErr *ValidationError
|
var vErr *ValidationError
|
||||||
option.activeValue, vErr = validateValue(option, value)
|
option.activeValue, vErr = validateValue(option, value)
|
||||||
if vErr != nil {
|
if vErr != nil {
|
||||||
return fmt.Errorf("config: invalid value: %w", vErr)
|
// we consider this error as a "soft" error so lazily registered
|
||||||
}
|
// options don't fail the hard way.
|
||||||
|
option.activeValue = option.activeFallbackValue
|
||||||
|
vErr.SoftError = true
|
||||||
|
|
||||||
|
return true, vErr
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -207,6 +207,7 @@ func validateValue(option *Option, value interface{}) (*valueCache, *ValidationE
|
||||||
type ValidationError struct {
|
type ValidationError struct {
|
||||||
Option *Option
|
Option *Option
|
||||||
Err error
|
Err error
|
||||||
|
SoftError bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// Error returns the formatted error.
|
// Error returns the formatted error.
|
||||||
|
|
Loading…
Add table
Reference in a new issue