frostfs-sdk-go/object/rw.go

441 lines
9.6 KiB
Go
Raw Normal View History

package object
import (
"github.com/nspcc-dev/neofs-api-go/v2/object"
"github.com/nspcc-dev/neofs-api-go/v2/refs"
"github.com/nspcc-dev/neofs-sdk-go/checksum"
cid "github.com/nspcc-dev/neofs-sdk-go/container/id"
oid "github.com/nspcc-dev/neofs-sdk-go/object/id"
"github.com/nspcc-dev/neofs-sdk-go/owner"
"github.com/nspcc-dev/neofs-sdk-go/session"
"github.com/nspcc-dev/neofs-sdk-go/signature"
"github.com/nspcc-dev/neofs-sdk-go/version"
)
// wrapper over v2 Object that provides
// public getter and private setters.
type rwObject object.Object
// ToV2 converts Object to v2 Object message.
func (o *rwObject) ToV2() *object.Object {
return (*object.Object)(o)
}
func (o *rwObject) setHeaderField(setter func(*object.Header)) {
obj := (*object.Object)(o)
h := obj.GetHeader()
if h == nil {
h = new(object.Header)
obj.SetHeader(h)
}
setter(h)
}
func (o *rwObject) setSplitFields(setter func(*object.SplitHeader)) {
o.setHeaderField(func(h *object.Header) {
split := h.GetSplit()
if split == nil {
split = new(object.SplitHeader)
h.SetSplit(split)
}
setter(split)
})
}
// ID returns object identifier.
func (o *rwObject) ID() *oid.ID {
return oid.NewIDFromV2(
(*object.Object)(o).
GetObjectID(),
)
}
func (o *rwObject) setID(v *oid.ID) {
(*object.Object)(o).
SetObjectID(v.ToV2())
}
// Signature returns signature of the object identifier.
func (o *rwObject) Signature() *signature.Signature {
return signature.NewFromV2(
(*object.Object)(o).GetSignature())
}
func (o *rwObject) setSignature(v *signature.Signature) {
(*object.Object)(o).SetSignature(v.ToV2())
}
// Payload returns payload bytes.
func (o *rwObject) Payload() []byte {
return (*object.Object)(o).GetPayload()
}
func (o *rwObject) setPayload(v []byte) {
(*object.Object)(o).SetPayload(v)
}
// Version returns version of the object.
func (o *rwObject) Version() *version.Version {
return version.NewFromV2(
(*object.Object)(o).
GetHeader().
GetVersion(),
)
}
func (o *rwObject) setVersion(v *version.Version) {
o.setHeaderField(func(h *object.Header) {
h.SetVersion(v.ToV2())
})
}
// PayloadSize returns payload length of the object.
func (o *rwObject) PayloadSize() uint64 {
return (*object.Object)(o).
GetHeader().
GetPayloadLength()
}
func (o *rwObject) setPayloadSize(v uint64) {
o.setHeaderField(func(h *object.Header) {
h.SetPayloadLength(v)
})
}
// ContainerID returns identifier of the related container.
func (o *rwObject) ContainerID() *cid.ID {
return cid.NewFromV2(
(*object.Object)(o).
GetHeader().
GetContainerID(),
)
}
func (o *rwObject) setContainerID(v *cid.ID) {
o.setHeaderField(func(h *object.Header) {
h.SetContainerID(v.ToV2())
})
}
// OwnerID returns identifier of the object owner.
func (o *rwObject) OwnerID() *owner.ID {
return owner.NewIDFromV2(
(*object.Object)(o).
GetHeader().
GetOwnerID(),
)
}
func (o *rwObject) setOwnerID(v *owner.ID) {
o.setHeaderField(func(h *object.Header) {
h.SetOwnerID(v.ToV2())
})
}
// CreationEpoch returns epoch number in which object was created.
func (o *rwObject) CreationEpoch() uint64 {
return (*object.Object)(o).
GetHeader().
GetCreationEpoch()
}
func (o *rwObject) setCreationEpoch(v uint64) {
o.setHeaderField(func(h *object.Header) {
h.SetCreationEpoch(v)
})
}
// PayloadChecksum returns checksum of the object payload.
func (o *rwObject) PayloadChecksum() *checksum.Checksum {
return checksum.NewFromV2(
(*object.Object)(o).
GetHeader().
GetPayloadHash(),
)
}
func (o *rwObject) setPayloadChecksum(v *checksum.Checksum) {
o.setHeaderField(func(h *object.Header) {
h.SetPayloadHash(v.ToV2())
})
}
// PayloadHomomorphicHash returns homomorphic hash of the object payload.
func (o *rwObject) PayloadHomomorphicHash() *checksum.Checksum {
return checksum.NewFromV2(
(*object.Object)(o).
GetHeader().
GetHomomorphicHash(),
)
}
func (o *rwObject) setPayloadHomomorphicHash(v *checksum.Checksum) {
o.setHeaderField(func(h *object.Header) {
h.SetHomomorphicHash(v.ToV2())
})
}
// Attributes returns object attributes.
func (o *rwObject) Attributes() []*Attribute {
attrs := (*object.Object)(o).
GetHeader().
GetAttributes()
res := make([]*Attribute, 0, len(attrs))
for i := range attrs {
res = append(res, NewAttributeFromV2(attrs[i]))
}
return res
}
func (o *rwObject) setAttributes(v ...*Attribute) {
attrs := make([]*object.Attribute, 0, len(v))
for i := range v {
attrs = append(attrs, v[i].ToV2())
}
o.setHeaderField(func(h *object.Header) {
h.SetAttributes(attrs)
})
}
// PreviousID returns identifier of the previous sibling object.
func (o *rwObject) PreviousID() *oid.ID {
return oid.NewIDFromV2(
(*object.Object)(o).
GetHeader().
GetSplit().
GetPrevious(),
)
}
func (o *rwObject) setPreviousID(v *oid.ID) {
o.setSplitFields(func(split *object.SplitHeader) {
split.SetPrevious(v.ToV2())
})
}
// Children return list of the identifiers of the child objects.
func (o *rwObject) Children() []*oid.ID {
ids := (*object.Object)(o).
GetHeader().
GetSplit().
GetChildren()
res := make([]*oid.ID, 0, len(ids))
for i := range ids {
res = append(res, oid.NewIDFromV2(ids[i]))
}
return res
}
func (o *rwObject) setChildren(v ...*oid.ID) {
ids := make([]*refs.ObjectID, 0, len(v))
for i := range v {
ids = append(ids, v[i].ToV2())
}
o.setSplitFields(func(split *object.SplitHeader) {
split.SetChildren(ids)
})
}
// NotificationInfo groups information about object notification
// that can be written to object.
//
// Topic is an optional field.
type NotificationInfo struct {
ni object.NotificationInfo
}
// Epoch returns object notification tick
// epoch.
func (n NotificationInfo) Epoch() uint64 {
return n.ni.Epoch()
}
// SetEpoch sets object notification tick
// epoch.
func (n *NotificationInfo) SetEpoch(epoch uint64) {
n.ni.SetEpoch(epoch)
}
// Topic return optional object notification
// topic.
func (n NotificationInfo) Topic() string {
return n.ni.Topic()
}
// SetTopic sets optional object notification
// topic.
func (n *NotificationInfo) SetTopic(topic string) {
n.ni.SetTopic(topic)
}
// NotificationInfo returns notification info
// read from the object structure.
// Returns any error that appeared during notification
// information parsing.
func (o *rwObject) NotificationInfo() (*NotificationInfo, error) {
ni, err := object.GetNotificationInfo((*object.Object)(o))
if err != nil {
return nil, err
}
return &NotificationInfo{
ni: *ni,
}, nil
}
func (o *rwObject) setNotification(ni NotificationInfo) {
object.WriteNotificationInfo((*object.Object)(o), ni.ni)
}
// SplitID return split identity of split object. If object is not split
// returns nil.
func (o *rwObject) SplitID() *SplitID {
return NewSplitIDFromV2(
(*object.Object)(o).
GetHeader().
GetSplit().
GetSplitID(),
)
}
func (o *rwObject) setSplitID(id *SplitID) {
o.setSplitFields(func(split *object.SplitHeader) {
split.SetSplitID(id.ToV2())
})
}
// ParentID returns identifier of the parent object.
func (o *rwObject) ParentID() *oid.ID {
return oid.NewIDFromV2(
(*object.Object)(o).
GetHeader().
GetSplit().
GetParent(),
)
}
func (o *rwObject) setParentID(v *oid.ID) {
o.setSplitFields(func(split *object.SplitHeader) {
split.SetParent(v.ToV2())
})
}
// Parent returns parent object w/o payload.
func (o *rwObject) Parent() *Object {
h := (*object.Object)(o).
GetHeader().
GetSplit()
parSig := h.GetParentSignature()
parHdr := h.GetParentHeader()
if parSig == nil && parHdr == nil {
return nil
}
oV2 := new(object.Object)
oV2.SetObjectID(h.GetParent())
oV2.SetSignature(parSig)
oV2.SetHeader(parHdr)
return NewFromV2(oV2)
}
func (o *rwObject) setParent(v *Object) {
o.setSplitFields(func(split *object.SplitHeader) {
split.SetParent((*object.Object)(v.rwObject).GetObjectID())
split.SetParentSignature((*object.Object)(v.rwObject).GetSignature())
split.SetParentHeader((*object.Object)(v.rwObject).GetHeader())
})
}
func (o *rwObject) initRelations() {
o.setHeaderField(func(h *object.Header) {
h.SetSplit(new(object.SplitHeader))
})
}
func (o *rwObject) resetRelations() {
o.setHeaderField(func(h *object.Header) {
h.SetSplit(nil)
})
}
// SessionToken returns token of the session
// within which object was created.
func (o *rwObject) SessionToken() *session.Token {
return session.NewTokenFromV2(
(*object.Object)(o).
GetHeader().
GetSessionToken(),
)
}
func (o *rwObject) setSessionToken(v *session.Token) {
o.setHeaderField(func(h *object.Header) {
h.SetSessionToken(v.ToV2())
})
}
// Type returns type of the object.
func (o *rwObject) Type() Type {
return TypeFromV2(
(*object.Object)(o).
GetHeader().
GetObjectType(),
)
}
func (o *rwObject) setType(t Type) {
o.setHeaderField(func(h *object.Header) {
h.SetObjectType(t.ToV2())
})
}
func (o *rwObject) cutPayload() *rwObject {
ov2 := new(object.Object)
*ov2 = *(*object.Object)(o)
ov2.SetPayload(nil)
return (*rwObject)(ov2)
}
func (o *rwObject) HasParent() bool {
return (*object.Object)(o).
GetHeader().
GetSplit() != nil
}
// Marshal marshals object into a protobuf binary form.
func (o *rwObject) Marshal() ([]byte, error) {
return (*object.Object)(o).StableMarshal(nil)
}
// Unmarshal unmarshals protobuf binary representation of object.
func (o *rwObject) Unmarshal(data []byte) error {
return (*object.Object)(o).Unmarshal(data)
}
// MarshalJSON encodes object to protobuf JSON format.
func (o *rwObject) MarshalJSON() ([]byte, error) {
return (*object.Object)(o).MarshalJSON()
}
// UnmarshalJSON decodes object from protobuf JSON format.
func (o *rwObject) UnmarshalJSON(data []byte) error {
return (*object.Object)(o).UnmarshalJSON(data)
}