4e31b4f231
In previous implementation `client` package provided access to nested response fields as pointers to them. This caused clients to handle nil cases even when the field presence in the response is required. Avoid returning pointers to required fields in response getters. This also reduces reference counter load and allows fields to be decoded directly without additional assignment. Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
106 lines
2.6 KiB
Go
106 lines
2.6 KiB
Go
package client
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
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
|
|
}
|
|
}
|
|
|
|
// IsErrEACLNotFound checks if err corresponds to NeoFS status
|
|
// return corresponding to missing eACL table. Supports wrapped errors.
|
|
func IsErrEACLNotFound(err error) bool {
|
|
switch unwrapErr(err).(type) {
|
|
default:
|
|
return false
|
|
case
|
|
apistatus.EACLNotFound,
|
|
*apistatus.EACLNotFound:
|
|
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
|
|
}
|
|
}
|
|
|
|
// IsErrSessionExpired checks if err corresponds to NeoFS status return
|
|
// corresponding to expired session. Supports wrapped errors.
|
|
func IsErrSessionExpired(err error) bool {
|
|
switch unwrapErr(err).(type) {
|
|
default:
|
|
return false
|
|
case
|
|
apistatus.SessionTokenExpired,
|
|
*apistatus.SessionTokenExpired:
|
|
return true
|
|
}
|
|
}
|
|
|
|
// IsErrSessionNotFound checks if err corresponds to NeoFS status return
|
|
// corresponding to missing session. Supports wrapped errors.
|
|
func IsErrSessionNotFound(err error) bool {
|
|
switch unwrapErr(err).(type) {
|
|
default:
|
|
return false
|
|
case
|
|
apistatus.SessionTokenNotFound,
|
|
*apistatus.SessionTokenNotFound:
|
|
return true
|
|
}
|
|
}
|
|
|
|
// returns error describing missing field with the given name.
|
|
func newErrMissingResponseField(name string) error {
|
|
return fmt.Errorf("missing %s field in the response", name)
|
|
}
|
|
|
|
// returns error describing invalid field (according to the NeoFS protocol)
|
|
// with the given name and format violation err.
|
|
func newErrInvalidResponseField(name string, err error) error {
|
|
return fmt.Errorf("invalid %s field in the response: %w", name, err)
|
|
}
|