[#140] sdk: Refactor reference types

Refactor v2-compatible reference types to be wrappers over corresponding
types from v2.

Signed-off-by: Leonard Lyubich <leonard@nspcc.ru>
This commit is contained in:
Leonard Lyubich 2020-09-10 12:57:29 +03:00 committed by Stanislav Bogatyrev
parent 2026473733
commit 524280a5e8
10 changed files with 73 additions and 215 deletions

View file

@ -1,60 +1,28 @@
package object
import (
"github.com/nspcc-dev/neofs-api-go/pkg/container"
"github.com/nspcc-dev/neofs-api-go/v2/refs"
"github.com/pkg/errors"
)
// Address represents address of NeoFS object.
type Address struct {
cid *container.ID
// Address represents v2-compatible object address.
type Address refs.Address
oid *ID
// NewAddressFromV2 converts v2 Address message to Address.
func NewAddressFromV2(aV2 *refs.Address) *Address {
return (*Address)(aV2)
}
// NewAddress creates and initializes blank Address.
//
// Works similar as NewAddressFromV2(new(Address)).
func NewAddress() *Address {
return NewAddressFromV2(new(refs.Address))
}
// ToV2 converts Address to v2 Address message.
func (a *Address) ToV2() *refs.Address {
if a != nil {
aV2 := new(refs.Address)
aV2.SetContainerID(a.cid.ToV2())
aV2.SetObjectID(a.oid.ToV2())
return aV2
}
return nil
}
// GetObjectIDV2 converts object identifier to v2 ObjectID message.
func (a *Address) GetObjectIDV2() *refs.ObjectID {
if a != nil {
return a.oid.ToV2()
}
return nil
}
// AddressFromV2 converts v2 Address message to Address.
func AddressFromV2(aV2 *refs.Address) (*Address, error) {
if aV2 == nil {
return nil, nil
}
oid, err := IDFromV2(aV2.GetObjectID())
if err != nil {
return nil, errors.Wrap(err, "could not convert object identifier")
}
cid, err := container.IDFromV2(aV2.GetContainerID())
if err != nil {
return nil, errors.Wrap(err, "could not convert container identifier")
}
return &Address{
cid: cid,
oid: oid,
}, nil
return (*refs.Address)(a)
}
// AddressFromBytes restores Address from a binary representation.
@ -64,5 +32,5 @@ func AddressFromBytes(data []byte) (*Address, error) {
return nil, errors.Wrap(err, "could not unmarshal object address")
}
return AddressFromV2(addrV2)
return NewAddressFromV2(addrV2), nil
}

View file

@ -4,47 +4,29 @@ import (
"crypto/sha256"
"github.com/nspcc-dev/neofs-api-go/v2/refs"
"github.com/pkg/errors"
)
// ID represents object identifier that
// supports different type of values.
type ID struct {
val []byte
// ID represents v2-compatible object identifier.
type ID refs.ObjectID
// NewIDFromV2 wraps v2 ObjectID message to ID.
func NewIDFromV2(idV2 *refs.ObjectID) *ID {
return (*ID)(idV2)
}
// NewID creates and initializes blank ID.
//
// Works similar as NewIDFromV2(new(ObjectID)).
func NewID() *ID {
return NewIDFromV2(new(refs.ObjectID))
}
// SetSHA256 sets object identifier value to SHA256 checksum.
func (id *ID) SetSHA256(v [sha256.Size]byte) {
if id != nil {
id.val = v[:]
}
(*refs.ObjectID)(id).SetValue(v[:])
}
// ToV2 converts ID to v2 ObjectID message.
func (id *ID) ToV2() *refs.ObjectID {
if id != nil {
idV2 := new(refs.ObjectID)
idV2.SetValue(id.val)
return idV2
}
return nil
}
// IDFromV2 converts v2 ObjectID message to ID.
//
// Returns an error if the format of the identifier
// in the message is broken.
func IDFromV2(idV2 *refs.ObjectID) (*ID, error) {
val := idV2.GetValue()
if ln := len(val); ln != sha256.Size {
return nil, errors.Errorf("could not convert %T to %T: invalid length %d",
idV2, (*ID)(nil), ln,
)
}
return &ID{
val: val,
}, nil
return (*refs.ObjectID)(id)
}

View file

@ -9,7 +9,7 @@ import (
)
func TestIDV2(t *testing.T) {
id := new(ID)
id := NewID()
checksum := [sha256.Size]byte{}
@ -20,8 +20,5 @@ func TestIDV2(t *testing.T) {
idV2 := id.ToV2()
id2, err := IDFromV2(idV2)
require.NoError(t, err)
require.Equal(t, id, id2)
require.Equal(t, checksum[:], idV2.GetValue())
}

View file

@ -59,7 +59,7 @@ func (o *Object) Verify() error {
hdrChecksum := sha256.Sum256(data)
if !bytes.Equal(hdrChecksum[:], o.id.val) {
if !bytes.Equal(hdrChecksum[:], o.id.ToV2().GetValue()) {
return errors.New("invalid object identifier")
}
@ -77,18 +77,6 @@ func (o *Object) Verify() error {
return nil
}
// Address returns address of the object.
func (o *Object) Address() *Address {
if o != nil {
return &Address{
cid: o.cid,
oid: o.id,
}
}
return nil
}
// GetPayload returns object payload bytes.
func (o *Object) GetPayload() []byte {
if o != nil {
@ -201,23 +189,8 @@ func FromV2(oV2 *object.Object) (*Object, error) {
return nil, nil
}
id, err := IDFromV2(oV2.GetObjectID())
if err != nil {
return nil, errors.Wrap(err, "could not convert object ID")
}
hdr := oV2.GetHeader()
ownerID, err := owner.IDFromV2(hdr.GetOwnerID())
if err != nil {
return nil, errors.Wrap(err, "could not convert owner ID")
}
cid, err := container.IDFromV2(hdr.GetContainerID())
if err != nil {
return nil, errors.Wrap(err, "could not convert container ID")
}
// TODO: convert other fields
sig := oV2.GetSignature()
@ -225,11 +198,11 @@ func FromV2(oV2 *object.Object) (*Object, error) {
return &Object{
rwObject: rwObject{
fin: true,
id: id,
id: NewIDFromV2(oV2.GetObjectID()),
key: sig.GetKey(),
sig: sig.GetSign(),
cid: cid,
ownerID: ownerID,
cid: container.NewIDFromV2(hdr.GetContainerID()),
ownerID: owner.NewIDFromV2(hdr.GetOwnerID()),
payloadChecksum: hdr.GetPayloadHash(),
payload: oV2.GetPayload(),
},