From a4f2a9bfabf05d0811e991e940238e36ca93fad6 Mon Sep 17 00:00:00 2001 From: Sylvain Prost Date: Wed, 8 Oct 2025 17:27:01 +0200 Subject: [PATCH] add AsType helper fn --- cause_go118.go | 8 ++++++++ cause_go118_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/cause_go118.go b/cause_go118.go index c271c02..946eee4 100644 --- a/cause_go118.go +++ b/cause_go118.go @@ -2,6 +2,8 @@ package errors +import "errors" + func IsOfType[T error](err error) bool { for { if _, ok := err.(T); ok || err == nil { @@ -11,3 +13,9 @@ func IsOfType[T error](err error) bool { err = Unwrap(err) } } + +func AsType[T error](err error) (T, bool) { + var e T + + return e, errors.As(err, &e) +} diff --git a/cause_go118_test.go b/cause_go118_test.go index 07db11a..2f50a57 100644 --- a/cause_go118_test.go +++ b/cause_go118_test.go @@ -39,3 +39,35 @@ func TestIsOfType(t *testing.T) { assert.Equal(t, tt.isMockError, IsOfType[mockError](tt.input)) } } + +func TestAsType(t *testing.T) { + for _, tt := range []struct { + name string + input error + expected error + }{ + { + name: "nil error", + }, + { + name: "mockError", + input: mockError{}, + expected: mockError{}, + }, + { + name: "wrapped mockError", + input: Wrap(mockError{}, "wrapping"), + expected: mockError{}, + }, + } { + t.Run(tt.name, func(t *testing.T) { + m, ok := AsType[mockError](tt.input) + + assert.Equal(t, tt.expected != nil, ok) + + if ok { + assert.Equal(t, tt.expected, m) + } + }) + } +}