frostfs-api-go/v2/refs/marshal.go
Alex Vanin 2c33e22db5 Add stable marshal for refs package
Signed-off-by: Alex Vanin <alexey@nspcc.ru>
2020-09-18 10:41:52 +03:00

157 lines
2.6 KiB
Go

package refs
import (
"encoding/binary"
"github.com/nspcc-dev/neofs-api-go/util/proto"
)
const (
OwnerIDValField = 1
ContainerIDValField = 1
ObjectIDValField = 1
AddressContainerField = 1
AddressObjectField = 2
)
func (o *OwnerID) StableMarshal(buf []byte) ([]byte, error) {
if o == nil {
return []byte{}, nil
}
if buf == nil {
buf = make([]byte, o.StableSize())
}
_, err := proto.BytesMarshal(OwnerIDValField, buf, o.val)
if err != nil {
return nil, err
}
return buf, nil
}
func (o *OwnerID) StableSize() int {
if o == nil {
return 0
}
return proto.BytesSize(OwnerIDValField, o.val)
}
func (c *ContainerID) StableMarshal(buf []byte) ([]byte, error) {
if c == nil {
return []byte{}, nil
}
if buf == nil {
buf = make([]byte, c.StableSize())
}
_, err := proto.BytesMarshal(ContainerIDValField, buf, c.val)
if err != nil {
return nil, err
}
return buf, nil
}
func (c *ContainerID) StableSize() int {
if c == nil {
return 0
}
return proto.BytesSize(ContainerIDValField, c.val)
}
func (o *ObjectID) StableMarshal(buf []byte) ([]byte, error) {
if o == nil {
return []byte{}, nil
}
if buf == nil {
buf = make([]byte, o.StableSize())
}
_, err := proto.BytesMarshal(ObjectIDValField, buf, o.val)
if err != nil {
return nil, err
}
return buf, nil
}
func (o *ObjectID) StableSize() int {
if o == nil {
return 0
}
return proto.BytesSize(ObjectIDValField, o.val)
}
func (a *Address) StableMarshal(buf []byte) ([]byte, error) {
if a == nil {
return []byte{}, nil
}
if buf == nil {
buf = make([]byte, a.StableSize())
}
var (
offset, n int
prefix uint64
err error
)
if a.cid != nil {
prefix, _ = proto.NestedStructurePrefix(AddressContainerField)
offset = binary.PutUvarint(buf, prefix)
n = a.cid.StableSize()
offset += binary.PutUvarint(buf[offset:], uint64(n))
_, err = a.cid.StableMarshal(buf[offset:])
if err != nil {
return nil, err
}
offset += n
}
if a.oid != nil {
prefix, _ = proto.NestedStructurePrefix(AddressObjectField)
offset += binary.PutUvarint(buf[offset:], prefix)
n = a.oid.StableSize()
offset += binary.PutUvarint(buf[offset:], uint64(n))
_, err = a.oid.StableMarshal(buf[offset:])
if err != nil {
return nil, err
}
}
return buf, nil
}
func (a *Address) StableSize() (size int) {
if a == nil {
return 0
}
if a.cid != nil {
_, ln := proto.NestedStructurePrefix(AddressContainerField)
n := a.cid.StableSize()
size += ln + proto.VarUIntSize(uint64(n)) + n
}
if a.oid != nil {
_, ln := proto.NestedStructurePrefix(AddressObjectField)
n := a.oid.StableSize()
size += ln + proto.VarUIntSize(uint64(n)) + n
}
return size
}