09ed6077f9
Client errors are quite often wrapped in context. When checking a specific error, it is required not to lose the ability to determine it, regardless of the attached context. In previous implementation `IsErr*` functions didn't support wrapped errors. Make `IsErr*` functions to preliminarily unwrap `error` argument before type assertion. Use `errors.Unwrap` for this instead of `errors.As` since the latter has the overhead of filling in an error. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
package client
|
|
|
|
import (
|
|
"errors"
|
|
|
|
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
|
)
|
|
|
|
// unwraps err using errors.Unwrap and returns the result.
|
|
func unwrapErr(err error) error {
|
|
for e := errors.Unwrap(err); e != nil; e = errors.Unwrap(err) {
|
|
err = e
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
// IsErrContainerNotFound checks if err corresponds to NeoFS status
|
|
// return corresponding to missing container. Supports wrapped errors.
|
|
func IsErrContainerNotFound(err error) bool {
|
|
switch unwrapErr(err).(type) {
|
|
default:
|
|
return false
|
|
case
|
|
apistatus.ContainerNotFound,
|
|
*apistatus.ContainerNotFound:
|
|
return true
|
|
}
|
|
}
|
|
|
|
// IsErrObjectNotFound checks if err corresponds to NeoFS status
|
|
// return corresponding to missing object. Supports wrapped errors.
|
|
func IsErrObjectNotFound(err error) bool {
|
|
switch unwrapErr(err).(type) {
|
|
default:
|
|
return false
|
|
case
|
|
apistatus.ObjectNotFound,
|
|
*apistatus.ObjectNotFound:
|
|
return true
|
|
}
|
|
}
|
|
|
|
// IsErrObjectAlreadyRemoved checks if err corresponds to NeoFS status
|
|
// return corresponding to already removed object. Supports wrapped errors.
|
|
func IsErrObjectAlreadyRemoved(err error) bool {
|
|
switch unwrapErr(err).(type) {
|
|
default:
|
|
return false
|
|
case
|
|
apistatus.ObjectAlreadyRemoved,
|
|
*apistatus.ObjectAlreadyRemoved:
|
|
return true
|
|
}
|
|
}
|