Skip to content

Commit

Permalink
use As to unwrap errors in Cast
Browse files Browse the repository at this point in the history
  • Loading branch information
zekroTJA committed Aug 1, 2024
1 parent 2c9574b commit 0a6bb5c
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 8 deletions.
8 changes: 4 additions & 4 deletions error.go
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,10 @@ func Cast(err error, fallback ...ErrorCode) Error {
}

var lastElkErr *Error
for _, err := range errs {
if elkErr, ok := err.(Error); ok {
for _, innerErr := range errs {
if elkErr, ok := As[Error](innerErr); ok {
if lastElkErr != nil {
return Wrap(code, err)
return Wrap(code, innerErr)
}
lastElkErr = &elkErr
}
Expand All @@ -95,7 +95,7 @@ func Cast(err error, fallback ...ErrorCode) Error {
return *lastElkErr
}

d, ok := err.(Error)
d, ok := As[Error](err)
if !ok {
d = Wrap(code, err)
d.callStack.offset++
Expand Down
45 changes: 41 additions & 4 deletions error_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import (
func TestCast(t *testing.T) {
const ErrCode = ErrorCode("some-error-code")

t.Run("cast-Error", func(t *testing.T) {
t.Run("error", func(t *testing.T) {
err := errors.New("some error")
wrappedErr := Wrap(ErrCode, err)
castError := Cast(wrappedErr)
Expand All @@ -19,23 +19,23 @@ func TestCast(t *testing.T) {
assert.Equal(t, err, castError.Unwrap())
})

t.Run("cast-error-default", func(t *testing.T) {
t.Run("error-default", func(t *testing.T) {
err := errors.New("some error")
castError := Cast(err)

assert.Equal(t, castError.Code(), CodeUnexpected)
assert.Equal(t, err, castError.Unwrap())
})

t.Run("cast-error-custom", func(t *testing.T) {
t.Run("error-custom", func(t *testing.T) {
err := errors.New("some error")
castError := Cast(err, ErrCode)

assert.Equal(t, castError.Code(), ErrCode)
assert.Equal(t, err, castError.Unwrap())
})

t.Run("cast-error-join", func(t *testing.T) {
t.Run("error-join", func(t *testing.T) {
err := errors.Join(nil)
castError := Cast(err, ErrCode)
assert.Equal(t, castError.Code(), ErrCode)
Expand All @@ -55,4 +55,41 @@ func TestCast(t *testing.T) {
castError = Cast(err, ErrCode)
assert.Equal(t, castError.Code(), ErrCode)
})

t.Run("custom-model", func(t *testing.T) {
errCode := ErrorCode("custom-code")

type MyError struct {
InnerError
SomeData string
}

err := MyError{
InnerError: InnerError{Inner: NewError(errCode, "some message")},
SomeData: "some data",
}

castErrCode := Cast(err).Code()
assert.Equal(t, errCode, castErrCode)
})

t.Run("custom-model-wrapped", func(t *testing.T) {
errCode := ErrorCode("custom-code")
wrappedErrCode := ErrorCode("wrapped-custom-code")

type MyError struct {
InnerError
SomeData string
}

wrappedErr := NewError(wrappedErrCode, "some message")

err := MyError{
InnerError: InnerError{Inner: Wrap(errCode, wrappedErr)},
SomeData: "some data",
}

castErrCode := Cast(err).Code()
assert.Equal(t, errCode, castErrCode)
})
}

0 comments on commit 0a6bb5c

Please sign in to comment.