diff options
Diffstat (limited to 'vendor/codeberg.org/gruf/go-errors/v2/value.go')
-rw-r--r-- | vendor/codeberg.org/gruf/go-errors/v2/value.go | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-errors/v2/value.go b/vendor/codeberg.org/gruf/go-errors/v2/value.go new file mode 100644 index 000000000..6a1f64451 --- /dev/null +++ b/vendor/codeberg.org/gruf/go-errors/v2/value.go @@ -0,0 +1,54 @@ +package errors + +// WithValue wraps err to store given key-value pair, accessible via Value() function. +func WithValue(err error, key any, value any) error { + if err == nil { + panic("nil error") + } + return &errWithValue{ + err: err, + key: key, + val: value, + } +} + +// Value searches for value stored under given key in error chain. +func Value(err error, key any) any { + var e *errWithValue + + if !As(err, &e) { + return nil + } + + return e.Value(key) +} + +type errWithValue struct { + err error + key any + val any +} + +func (e *errWithValue) Error() string { + return e.err.Error() +} + +func (e *errWithValue) Is(target error) bool { + return e.err == target +} + +func (e *errWithValue) Unwrap() error { + return Unwrap(e.err) +} + +func (e *errWithValue) Value(key any) any { + for { + if key == e.key { + return e.val + } + + if !As(e.err, &e) { + return nil + } + } +} |