forked from TrueCloudLab/frostfs-sdk-go
client: Add separate error for each apistatus
Signed-off-by: Evgenii Baidakov <evgenii@nspcc.io>
This commit is contained in:
parent
9d25bc7519
commit
fc0bd12101
4 changed files with 132 additions and 4 deletions
|
@ -2,10 +2,30 @@ package apistatus
|
|||
|
||||
import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
|
||||
"github.com/nspcc-dev/neofs-api-go/v2/status"
|
||||
)
|
||||
|
||||
// Error describes common error which is a grouping type for any [apistatus] errors. Any [apistatus] error may be checked
|
||||
// explicitly via it's type of just check the group via errors.Is(err, [apistatus.Error]).
|
||||
var Error = errors.New("api error")
|
||||
|
||||
var (
|
||||
// ErrServerInternal is an instance of ServerInternal error status. It's expected to be used for [errors.Is]
|
||||
// and MUST NOT be changed.
|
||||
ErrServerInternal ServerInternal
|
||||
// ErrWrongMagicNumber is an instance of WrongMagicNumber error status. It's expected to be used for [errors.Is]
|
||||
// and MUST NOT be changed.
|
||||
ErrWrongMagicNumber WrongMagicNumber
|
||||
// ErrSignatureVerification is an instance of SignatureVerification error status. It's expected to be used for [errors.Is]
|
||||
// and MUST NOT be changed.
|
||||
ErrSignatureVerification SignatureVerification
|
||||
// ErrNodeUnderMaintenance is an instance of NodeUnderMaintenance error status. It's expected to be used for [errors.Is]
|
||||
// and MUST NOT be changed.
|
||||
ErrNodeUnderMaintenance NodeUnderMaintenance
|
||||
)
|
||||
|
||||
// ServerInternal describes failure statuses related to internal server errors.
|
||||
// Instances provide [Status], [StatusV2] and error interfaces.
|
||||
//
|
||||
|
@ -21,6 +41,16 @@ func (x ServerInternal) Error() string {
|
|||
)
|
||||
}
|
||||
|
||||
// Is implements interface for correct checking current error type with [errors.Is].
|
||||
func (x ServerInternal) Is(target error) bool {
|
||||
switch target.(type) {
|
||||
default:
|
||||
return false
|
||||
case ServerInternal, *ServerInternal:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// implements local interface defined in FromStatusV2 func.
|
||||
func (x *ServerInternal) fromStatusV2(st *status.Status) {
|
||||
x.v2 = *st
|
||||
|
@ -69,6 +99,16 @@ func (x WrongMagicNumber) Error() string {
|
|||
)
|
||||
}
|
||||
|
||||
// Is implements interface for correct checking current error type with [errors.Is].
|
||||
func (x WrongMagicNumber) Is(target error) bool {
|
||||
switch target.(type) {
|
||||
default:
|
||||
return false
|
||||
case WrongMagicNumber, *WrongMagicNumber:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// implements local interface defined in FromStatusV2 func.
|
||||
func (x *WrongMagicNumber) fromStatusV2(st *status.Status) {
|
||||
x.v2 = *st
|
||||
|
@ -144,6 +184,16 @@ func (x SignatureVerification) Error() string {
|
|||
)
|
||||
}
|
||||
|
||||
// Is implements interface for correct checking current error type with [errors.Is].
|
||||
func (x SignatureVerification) Is(target error) bool {
|
||||
switch target.(type) {
|
||||
default:
|
||||
return false
|
||||
case SignatureVerification, *SignatureVerification:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// implements local interface defined in FromStatusV2 func.
|
||||
func (x *SignatureVerification) fromStatusV2(st *status.Status) {
|
||||
x.v2 = *st
|
||||
|
@ -203,6 +253,16 @@ func (x NodeUnderMaintenance) Error() string {
|
|||
)
|
||||
}
|
||||
|
||||
// Is implements interface for correct checking current error type with [errors.Is].
|
||||
func (x NodeUnderMaintenance) Is(target error) bool {
|
||||
switch target.(type) {
|
||||
default:
|
||||
return false
|
||||
case NodeUnderMaintenance, *NodeUnderMaintenance:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
func (x *NodeUnderMaintenance) fromStatusV2(st *status.Status) {
|
||||
x.v2 = *st
|
||||
}
|
||||
|
|
|
@ -6,12 +6,24 @@ import (
|
|||
)
|
||||
|
||||
var (
|
||||
// ErrObjectLocked is an instance of ObjectLocked error status. It's expected to be used for [errors.Is]
|
||||
// and MUST NOT be changed.
|
||||
ErrObjectLocked ObjectLocked
|
||||
// ErrObjectAlreadyRemoved is an instance of ObjectAlreadyRemoved error status. It's expected to be used for [errors.Is]
|
||||
// and MUST NOT be changed.
|
||||
ErrObjectAlreadyRemoved ObjectAlreadyRemoved
|
||||
// ErrLockNonRegularObject is an instance of LockNonRegularObject error status. It's expected to be used for [errors.Is]
|
||||
// and MUST NOT be changed.
|
||||
ErrLockNonRegularObject LockNonRegularObject
|
||||
// ErrObjectAccessDenied is an instance of ObjectAccessDenied error status. It's expected to be used for [errors.Is]
|
||||
// and MUST NOT be changed.
|
||||
ErrObjectAccessDenied ObjectAccessDenied
|
||||
// ErrObjectNotFound is an instance of ObjectNotFound error status. It's expected to be used for [errors.Is]
|
||||
// and MUST NOT be changed.
|
||||
ErrObjectNotFound ObjectNotFound
|
||||
// ErrObjectOutOfRange is an instance of ObjectOutOfRange error status. It's expected to be used for [errors.Is]
|
||||
// and MUST NOT be changed.
|
||||
ErrObjectOutOfRange ObjectOutOfRange
|
||||
)
|
||||
|
||||
// ObjectLocked describes status of the failure because of the locked object.
|
||||
|
@ -34,6 +46,16 @@ func (x ObjectLocked) Error() string {
|
|||
)
|
||||
}
|
||||
|
||||
// Is implements interface for correct checking current error type with [errors.Is].
|
||||
func (x ObjectLocked) Is(target error) bool {
|
||||
switch target.(type) {
|
||||
default:
|
||||
return false
|
||||
case ObjectLocked, *ObjectLocked:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// implements local interface defined in FromStatusV2 func.
|
||||
func (x *ObjectLocked) fromStatusV2(st *status.Status) {
|
||||
x.v2 = *st
|
||||
|
@ -71,6 +93,16 @@ func (x LockNonRegularObject) Error() string {
|
|||
)
|
||||
}
|
||||
|
||||
// Is implements interface for correct checking current error type with [errors.Is].
|
||||
func (x LockNonRegularObject) Is(target error) bool {
|
||||
switch target.(type) {
|
||||
default:
|
||||
return false
|
||||
case LockNonRegularObject, *LockNonRegularObject:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// implements local interface defined in FromStatusV2 func.
|
||||
func (x *LockNonRegularObject) fromStatusV2(st *status.Status) {
|
||||
x.v2 = *st
|
||||
|
@ -108,6 +140,16 @@ func (x ObjectAccessDenied) Error() string {
|
|||
)
|
||||
}
|
||||
|
||||
// Is implements interface for correct checking current error type with [errors.Is].
|
||||
func (x ObjectAccessDenied) Is(target error) bool {
|
||||
switch target.(type) {
|
||||
default:
|
||||
return false
|
||||
case ObjectAccessDenied, *ObjectAccessDenied:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// implements local interface defined in FromStatusV2 func.
|
||||
func (x *ObjectAccessDenied) fromStatusV2(st *status.Status) {
|
||||
x.v2 = *st
|
||||
|
@ -251,6 +293,16 @@ func (x ObjectOutOfRange) Error() string {
|
|||
)
|
||||
}
|
||||
|
||||
// Is implements interface for correct checking current error type with [errors.Is].
|
||||
func (x ObjectOutOfRange) Is(target error) bool {
|
||||
switch target.(type) {
|
||||
default:
|
||||
return false
|
||||
case ObjectOutOfRange, *ObjectOutOfRange:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// implements local interface defined in FromStatusV2 func.
|
||||
func (x *ObjectOutOfRange) fromStatusV2(st *status.Status) {
|
||||
x.v2 = *st
|
||||
|
|
|
@ -4,15 +4,31 @@ import (
|
|||
"github.com/nspcc-dev/neofs-api-go/v2/status"
|
||||
)
|
||||
|
||||
type unrecognizedStatusV2 struct {
|
||||
// ErrUnrecognizedStatusV2 is an instance of UnrecognizedStatusV2 error status. It's expected to be used for [errors.Is]
|
||||
// and MUST NOT be changed.
|
||||
var ErrUnrecognizedStatusV2 UnrecognizedStatusV2
|
||||
|
||||
// UnrecognizedStatusV2 describes status of the uncertain failure.
|
||||
// Instances provide [Status], [StatusV2] and error interfaces.
|
||||
type UnrecognizedStatusV2 struct {
|
||||
v2 status.Status
|
||||
}
|
||||
|
||||
func (x unrecognizedStatusV2) Error() string {
|
||||
func (x UnrecognizedStatusV2) Error() string {
|
||||
return errMessageStatusV2("unrecognized", x.v2.Message())
|
||||
}
|
||||
|
||||
// Is implements interface for correct checking current error type with [errors.Is].
|
||||
func (x UnrecognizedStatusV2) Is(target error) bool {
|
||||
switch target.(type) {
|
||||
default:
|
||||
return false
|
||||
case UnrecognizedStatusV2, *UnrecognizedStatusV2:
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// implements local interface defined in FromStatusV2 func.
|
||||
func (x *unrecognizedStatusV2) fromStatusV2(st *status.Status) {
|
||||
func (x *UnrecognizedStatusV2) fromStatusV2(st *status.Status) {
|
||||
x.v2 = *st
|
||||
}
|
||||
|
|
|
@ -95,7 +95,7 @@ func FromStatusV2(st *status.Status) Status {
|
|||
}
|
||||
|
||||
if decoder == nil {
|
||||
decoder = new(unrecognizedStatusV2)
|
||||
decoder = new(UnrecognizedStatusV2)
|
||||
}
|
||||
|
||||
decoder.fromStatusV2(st)
|
||||
|
|
Loading…
Reference in a new issue