forked from TrueCloudLab/frostfs-sdk-go
client: Remove ErrFromStatus function
Signed-off-by: Evgenii Baidakov <evgenii@nspcc.io>
This commit is contained in:
parent
e2a88bc258
commit
277b8f7de4
5 changed files with 28 additions and 40 deletions
|
@ -207,13 +207,16 @@ func (x *contextCall) processResponse() bool {
|
|||
|
||||
// processResponse verifies response signature.
|
||||
func (c *Client) processResponse(resp responseV2) error {
|
||||
err := verifyServiceMessage(resp)
|
||||
if err != nil {
|
||||
if err := verifyServiceMessage(resp); err != nil {
|
||||
return fmt.Errorf("invalid response signature: %w", err)
|
||||
}
|
||||
|
||||
st := apistatus.FromStatusV2(resp.GetMetaHeader().GetStatus())
|
||||
return apistatus.ErrFromStatus(st)
|
||||
if err, ok := st.(error); ok {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// reads response (if rResp is set) and processes it. Result means success.
|
||||
|
|
|
@ -12,7 +12,6 @@ import (
|
|||
"github.com/nspcc-dev/neofs-api-go/v2/rpc/client"
|
||||
v2session "github.com/nspcc-dev/neofs-api-go/v2/session"
|
||||
"github.com/nspcc-dev/neofs-sdk-go/bearer"
|
||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
||||
neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
|
||||
"github.com/nspcc-dev/neofs-sdk-go/object"
|
||||
|
@ -274,12 +273,12 @@ func (x *objectWriter) InitDataStream(header object.Object) (io.Writer, error) {
|
|||
}, nil
|
||||
}
|
||||
|
||||
res, err := stream.Close()
|
||||
_, err = stream.Close()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return nil, apistatus.ErrFromStatus(res)
|
||||
return nil, errors.New("unexpected error")
|
||||
}
|
||||
|
||||
type payloadWriter struct {
|
||||
|
@ -295,12 +294,12 @@ func (x *payloadWriter) Write(p []byte) (int, error) {
|
|||
}
|
||||
|
||||
func (x *payloadWriter) Close() error {
|
||||
res, err := x.stream.Close()
|
||||
_, err := x.stream.Close()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return apistatus.ErrFromStatus(res)
|
||||
return nil
|
||||
}
|
||||
|
||||
// CreateObject creates new NeoFS object with given payload data and stores it
|
||||
|
|
|
@ -6,24 +6,10 @@ package apistatus
|
|||
// - statuses that implement the build-in error interface are considered failed statuses;
|
||||
// - all other value types are considered successes (nil is a default success).
|
||||
//
|
||||
// In Go code type of success can be determined by a type switch, failure - by a switch with errors.As calls.
|
||||
// In Go code type of success can be determined by a type switch, failure - by a switch with [errors.As] calls.
|
||||
// Nil should be considered as a success, and default switch section - as an unrecognized Status.
|
||||
//
|
||||
// To convert statuses into errors and vice versa, use functions ErrToStatus and ErrFromStatus, respectively.
|
||||
// ErrFromStatus function returns nil for successful statuses. However, to simplify the check of statuses for success,
|
||||
// IsSuccessful function should be used (try to avoid nil comparison).
|
||||
// It should be noted that using direct typecasting is not a compatible approach.
|
||||
//
|
||||
// To transport statuses using the NeoFS API V2 protocol, see StatusV2 interface and FromStatusV2 and ToStatusV2 functions.
|
||||
// To transport statuses using the NeoFS API V2 protocol, see [StatusV2] interface and [FromStatusV2] and [ToStatusV2] functions.
|
||||
type Status any
|
||||
|
||||
// ErrFromStatus converts Status instance to error if it is failed. Returns nil on successful Status.
|
||||
//
|
||||
// Note: direct assignment may not be compatibility-safe.
|
||||
func ErrFromStatus(st Status) error {
|
||||
if err, ok := st.(error); ok {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -224,15 +224,17 @@ func TestFromStatusV2(t *testing.T) {
|
|||
}
|
||||
|
||||
randomError := errors.New("garbage")
|
||||
errFromStatus := apistatus.ErrFromStatus(st)
|
||||
// some `st` in test-cases is int, bool, string
|
||||
errFromStatus, ok := st.(error)
|
||||
if ok {
|
||||
for _, err := range testItem.compatibleErrs {
|
||||
require.ErrorIs(t, errFromStatus, err)
|
||||
require.NotErrorIs(t, randomError, err)
|
||||
}
|
||||
|
||||
for _, err := range testItem.compatibleErrs {
|
||||
require.ErrorIs(t, errFromStatus, err)
|
||||
require.NotErrorIs(t, randomError, err)
|
||||
}
|
||||
|
||||
if testItem.checkAsErr != nil {
|
||||
require.True(t, testItem.checkAsErr(errFromStatus))
|
||||
if testItem.checkAsErr != nil {
|
||||
require.True(t, testItem.checkAsErr(errFromStatus))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,6 @@ import (
|
|||
sessionv2 "github.com/nspcc-dev/neofs-api-go/v2/session"
|
||||
"github.com/nspcc-dev/neofs-sdk-go/accounting"
|
||||
sdkClient "github.com/nspcc-dev/neofs-sdk-go/client"
|
||||
apistatus "github.com/nspcc-dev/neofs-sdk-go/client/status"
|
||||
"github.com/nspcc-dev/neofs-sdk-go/container"
|
||||
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
|
||||
neofscrypto "github.com/nspcc-dev/neofs-sdk-go/crypto"
|
||||
|
@ -27,7 +26,7 @@ type mockClient struct {
|
|||
errorOnCreateSession bool
|
||||
errorOnEndpointInfo bool
|
||||
errorOnNetworkInfo bool
|
||||
stOnGetObject apistatus.Status
|
||||
errOnGetObject error
|
||||
}
|
||||
|
||||
func newMockClient(addr string, signer neofscrypto.Signer) *mockClient {
|
||||
|
@ -60,8 +59,8 @@ func (m *mockClient) errOnDial() {
|
|||
m.errOnNetworkInfo()
|
||||
}
|
||||
|
||||
func (m *mockClient) statusOnGetObject(st apistatus.Status) {
|
||||
m.stOnGetObject = st
|
||||
func (m *mockClient) statusOnGetObject(err error) {
|
||||
m.errOnGetObject = err
|
||||
}
|
||||
|
||||
func newToken(signer neofscrypto.Signer) *session.Object {
|
||||
|
@ -139,13 +138,12 @@ func (m *mockClient) objectDelete(context.Context, PrmObjectDelete) error {
|
|||
func (m *mockClient) objectGet(context.Context, PrmObjectGet) (ResGetObject, error) {
|
||||
var res ResGetObject
|
||||
|
||||
if m.stOnGetObject == nil {
|
||||
if m.errOnGetObject == nil {
|
||||
return res, nil
|
||||
}
|
||||
|
||||
err := apistatus.ErrFromStatus(m.stOnGetObject)
|
||||
m.updateErrorRate(err)
|
||||
return res, err
|
||||
m.updateErrorRate(m.errOnGetObject)
|
||||
return res, m.errOnGetObject
|
||||
}
|
||||
|
||||
func (m *mockClient) objectHead(context.Context, PrmObjectHead) (object.Object, error) {
|
||||
|
|
Loading…
Reference in a new issue