summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-errors/v2/value.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/codeberg.org/gruf/go-errors/v2/value.go')
-rw-r--r--vendor/codeberg.org/gruf/go-errors/v2/value.go54
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
+ }
+ }
+}