[#340] object: Introduce SplitHeader type

* Also introduce `SplitHeader` getter and `SetSplitHeader` setter
  for `Object` type.

Signed-off-by: Airat Arifullin <a.arifullin@yadro.com>
This commit is contained in:
Airat Arifullin 2025-03-04 17:58:08 +03:00
parent 603bca7ee3
commit 5205c1ac6d
2 changed files with 150 additions and 0 deletions

View file

@ -345,6 +345,32 @@ func (o *Object) SetAttributes(v ...Attribute) {
})
}
// SplitHeader returns split header of the object. If it's set, then split header
// defines how the object relates to other objects in a split operation.
func (o *Object) SplitHeader() (splitHeader *SplitHeader) {
if v2 := (*object.Object)(o).
GetHeader().
GetSplit(); v2 != nil {
splitHeader = NewSplitHeaderFromV2(v2)
}
return
}
// SetSplitHeader sets split header.
func (o *Object) SetSplitHeader(v *SplitHeader) {
o.setSplitFields(func(sh *object.SplitHeader) {
v2 := v.ToV2()
sh.SetParent(v2.GetParent())
sh.SetPrevious(v2.GetPrevious())
sh.SetParentHeader(v2.GetParentHeader())
sh.SetParentSignature(v2.GetParentSignature())
sh.SetChildren(v2.GetChildren())
sh.SetSplitID(v2.GetSplitID())
})
}
// PreviousID returns identifier of the previous sibling object.
func (o *Object) PreviousID() (v oid.ID, isSet bool) {
v2 := (*object.Object)(o)

124
object/split_header.go Normal file
View file

@ -0,0 +1,124 @@
package object
import (
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/object"
"git.frostfs.info/TrueCloudLab/frostfs-sdk-go/api/refs"
frostfscrypto "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/crypto"
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
)
// SplitHeader is an object's header component that defines the relationship
// between this object and other objects if the object is part of a split operation.
type SplitHeader object.SplitHeader
// NewSplitHeaderFromV2 wraps v2 SplitHeader message to SplitHeader.
func NewSplitHeaderFromV2(v2 *object.SplitHeader) *SplitHeader {
return (*SplitHeader)(v2)
}
// NewSplitHeader creates blank SplitHeader instance.
func NewSplitHeader() *SplitHeader {
return NewSplitHeaderFromV2(new(object.SplitHeader))
}
func (sh *SplitHeader) ToV2() *object.SplitHeader {
return (*object.SplitHeader)(sh)
}
func (sh *SplitHeader) ParentID() (v oid.ID, isSet bool) {
v2 := (*object.SplitHeader)(sh)
if id := v2.GetParent(); id != nil {
_ = v.ReadFromV2(*id)
isSet = true
}
return
}
func (sh *SplitHeader) SetParentID(v oid.ID) {
v2 := new(refs.ObjectID)
v.WriteToV2(v2)
(*object.SplitHeader)(sh).SetParent(v2)
}
func (sh *SplitHeader) PreviousID() (v oid.ID, isSet bool) {
v2 := (*object.SplitHeader)(sh)
if id := v2.GetPrevious(); id != nil {
_ = v.ReadFromV2(*id)
isSet = true
}
return
}
func (sh *SplitHeader) SetPreviousID(v oid.ID) {
v2 := new(refs.ObjectID)
v.WriteToV2(v2)
(*object.SplitHeader)(sh).SetPrevious(v2)
}
func (sh *SplitHeader) ParentSignature() *frostfscrypto.Signature {
v2 := (*object.SplitHeader)(sh)
if parSigV2 := v2.GetParentSignature(); parSigV2 != nil {
parSig := new(frostfscrypto.Signature)
_ = parSig.ReadFromV2(*parSigV2)
}
return nil
}
func (sh *SplitHeader) SetParentSignature(v *frostfscrypto.Signature) {
var parSigV2 *refs.Signature
if v != nil {
parSigV2 = new(refs.Signature)
v.WriteToV2(parSigV2)
}
(*object.SplitHeader)(sh).SetParentSignature(parSigV2)
}
func (sh *SplitHeader) ParentHeader() (parentHeader *Object) {
v2 := (*object.SplitHeader)(sh)
if parHdr := v2.GetParentHeader(); parHdr != nil {
parentHeader = New()
parentHeader.setHeaderField(func(h *object.Header) {
*h = *v2.GetParentHeader()
})
}
return
}
func (sh *SplitHeader) SetParentHeader(parentHeader *Object) {
(*object.SplitHeader)(sh).SetParentHeader(parentHeader.ToV2().GetHeader())
}
func (sh *SplitHeader) Children() (res []oid.ID) {
v2 := (*object.SplitHeader)(sh)
if children := v2.GetChildren(); len(children) > 0 {
res = make([]oid.ID, len(children))
for i := range children {
_ = res[i].ReadFromV2(children[i])
}
}
return
}
func (sh *SplitHeader) SetChildren(children []oid.ID) {
v2Children := make([]refs.ObjectID, len(children))
for i := range children {
children[i].WriteToV2(&v2Children[i])
}
(*object.SplitHeader)(sh).SetChildren(v2Children)
}
func (sh *SplitHeader) SplitID() *SplitID {
return NewSplitIDFromV2((*object.SplitHeader)(sh).GetSplitID())
}
func (sh *SplitHeader) SetSplitID(v *SplitID) {
(*object.SplitHeader)(sh).SetSplitID(v.ToV2())
}