53 lines
1.2 KiB
Go
53 lines
1.2 KiB
Go
package errors
|
|
|
|
// Unwrap returns the result of calling the Unwrap method on err, if err implements
|
|
// Unwrap. Otherwise, Unwrap returns nil.
|
|
//
|
|
// It supports both Go 1.13 Unwrap and github.com/pkg/errors.Causer interfaces
|
|
// (the former takes precedence).
|
|
func Unwrap(err error) error {
|
|
switch e := err.(type) {
|
|
case interface{ Unwrap() error }:
|
|
return e.Unwrap()
|
|
|
|
case interface{ Cause() error }:
|
|
return e.Cause()
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// UnwrapEach loops through an error chain and calls a function for each of them.
|
|
//
|
|
// The provided function can return false to break the loop before it reaches the end of the chain.
|
|
//
|
|
// It supports both Go 1.13 errors.Wrapper and github.com/pkg/errors.Causer interfaces
|
|
// (the former takes precedence).
|
|
func UnwrapEach(err error, fn func(err error) bool) {
|
|
for err != nil {
|
|
continueLoop := fn(err)
|
|
if !continueLoop {
|
|
break
|
|
}
|
|
|
|
err = Unwrap(err)
|
|
}
|
|
}
|
|
|
|
// Cause returns the last error (root cause) in an err's chain.
|
|
// If err has no chain, it is returned directly.
|
|
//
|
|
// It supports both Go 1.13 errors.Wrapper and github.com/pkg/errors.Causer interfaces
|
|
// (the former takes precedence).
|
|
func Cause(err error) error {
|
|
for {
|
|
cause := Unwrap(err)
|
|
if cause == nil {
|
|
break
|
|
}
|
|
|
|
err = cause
|
|
}
|
|
|
|
return err
|
|
}
|