summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/errors.go29
1 files changed, 29 insertions, 0 deletions
diff --git a/common/errors.go b/common/errors.go
new file mode 100644
index 0000000..ba686f1
--- /dev/null
+++ b/common/errors.go
@@ -0,0 +1,29 @@
+package common
+
+import (
+ "errors"
+ "reflect"
+)
+
+// IsErrorOfType is a modified version of errors.Is, which loosen the check condition
+func IsErrorOfType(err, target error) bool {
+ if target == nil {
+ return err == target
+ }
+
+ isComparable := reflect.TypeOf(target).Comparable()
+ for {
+ if isComparable && reflect.TypeOf(target) == reflect.TypeOf(err) {
+ return true
+ }
+ if x, ok := err.(interface{ Is(error) bool }); ok && x.Is(target) {
+ return true
+ }
+ // TODO: consider supporting target.Is(err). This would allow
+ // user-definable predicates, but also may allow for coping with sloppy
+ // APIs, thereby making it easier to get away with them.
+ if err = errors.Unwrap(err); err == nil {
+ return false
+ }
+ }
+}