Allow errors from loadUnmappedValue to be "soft" errors. Signal config changes when loading unmapped values

This commit is contained in:
Patrick Pacher 2023-05-23 10:56:32 +02:00
parent 34453d6989
commit f423570475
No known key found for this signature in database
GPG key ID: E8CD2DA160925A6D
2 changed files with 23 additions and 8 deletions

View file

@ -104,29 +104,43 @@ func Register(option *Option) error {
return fmt.Errorf("config: invalid default value: %w", vErr)
}
if err := loadUnmappedValue(option); err != nil {
return err
hasUnmappedValue, vErr := loadUnmappedValue(option)
if vErr != nil && !vErr.SoftError {
return fmt.Errorf("config: invalid value: %w", vErr)
}
optionsLock.Lock()
defer optionsLock.Unlock()
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()
defer unmappedValuesLock.Unlock()
if value, ok := unmappedValues[option.Key]; ok {
delete(unmappedValues, option.Key)
var vErr *ValidationError
option.activeValue, vErr = validateValue(option, value)
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 true, nil
}
return nil
return false, nil
}

View file

@ -205,8 +205,9 @@ func validateValue(option *Option, value interface{}) (*valueCache, *ValidationE
// ValidationError error holds details about a config option value validation error.
type ValidationError struct {
Option *Option
Err error
Option *Option
Err error
SoftError bool
}
// Error returns the formatted error.