diff --git a/error.go b/error.go index a2fdc15..b9ce1d4 100644 --- a/error.go +++ b/error.go @@ -15,3 +15,7 @@ type Error struct { func (e *Error) Error() string { return fmt.Sprintf("code: %d, message: %s", e.Code, e.Message) } + +func (e *Error) Is(target error) bool { + return e != nil && target == ErrObjectNotFound && e.Code == 430004 +} diff --git a/error_test.go b/error_test.go new file mode 100644 index 0000000..ba1a403 --- /dev/null +++ b/error_test.go @@ -0,0 +1,31 @@ +package sdk + +import ( + "errors" + "fmt" + "testing" +) + +func TestErrorIsObjectNotFound(t *testing.T) { + if !errors.Is(&Error{Code: 430004}, ErrObjectNotFound) { + t.Fatal("expected 430004 to match ErrObjectNotFound") + } + wrapped := fmt.Errorf("get folder info: %w", &Error{Code: 430004}) + if !errors.Is(wrapped, ErrObjectNotFound) { + t.Fatal("expected wrapped 430004 to match ErrObjectNotFound") + } + var sdkErr *Error + if !errors.As(wrapped, &sdkErr) || sdkErr.Code != 430004 { + t.Fatal("expected wrapped error to preserve *Error") + } + if errors.Is(&Error{Code: 430005}, ErrObjectNotFound) { + t.Fatal("unexpected object-not-found match") + } + if errors.Is(&Error{Code: 430004}, errors.New("object not found")) { + t.Fatal("unexpected match for a different target") + } + var nilErr *Error + if errors.Is(nilErr, ErrObjectNotFound) { + t.Fatal("unexpected match for a nil error") + } +}