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) 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 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. // ValidationError error holds details about a config option value validation error.
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.