diff --git a/errors/gerror/gerror.go b/errors/gerror/gerror.go index 95a2494a2..ee3e6c746 100644 --- a/errors/gerror/gerror.go +++ b/errors/gerror/gerror.go @@ -222,6 +222,9 @@ func Code(err error) gcode.Code { if e, ok := err.(iNext); ok { return Code(e.Next()) } + if e, ok := err.(iUnwrap); ok { + return Code(e.Unwrap()) + } return gcode.CodeNil } @@ -236,6 +239,9 @@ func Cause(err error) error { if e, ok := err.(iNext); ok { return Cause(e.Next()) } + if e, ok := err.(iUnwrap); ok { + return Cause(e.Unwrap()) + } return err } diff --git a/errors/gerror/gerror_interface.go b/errors/gerror/gerror_interface.go index 317f951dc..f4b5a32d7 100644 --- a/errors/gerror/gerror_interface.go +++ b/errors/gerror/gerror_interface.go @@ -49,3 +49,9 @@ type iNext interface { Error() string Next() error } + +// iUnwrap is the interface for Unwrap feature. +type iUnwrap interface { + Error() string + Unwrap() error +} diff --git a/errors/gerror/gerror_z_example_test.go b/errors/gerror/gerror_z_example_test.go index e43338e9c..998b54237 100644 --- a/errors/gerror/gerror_z_example_test.go +++ b/errors/gerror/gerror_z_example_test.go @@ -55,3 +55,30 @@ func ExampleWrapCodef() { // It's Custom Error: permission denied // 10000 } + +func ExampleEqual() { + err1 := errors.New("permission denied") + err2 := gerror.New("permission denied") + err3 := gerror.NewCode(gcode.CodeNotAuthorized, "permission denied") + fmt.Println(gerror.Equal(err1, err2)) + fmt.Println(gerror.Equal(err2, err3)) + + // Output: + // true + // false +} + +func ExampleIs() { + err1 := errors.New("permission denied") + err2 := gerror.Wrap(err1, "operation failed") + fmt.Println(gerror.Is(err1, err1)) + fmt.Println(gerror.Is(err2, err2)) + fmt.Println(gerror.Is(err2, err1)) + fmt.Println(gerror.Is(err1, err2)) + + // Output: + // false + // true + // true + // false +}