From 177ecb3de2f9ca8e23c3eeb19b6875a0c6593355 Mon Sep 17 00:00:00 2001 From: Keuin Date: Thu, 8 Sep 2022 13:27:37 +0800 Subject: Support specify IP network type (ipv4, ipv6, in arbitrary combination and priority) --- common/errors.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 common/errors.go (limited to 'common') 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 + } + } +} -- cgit v1.2.3