forked from TrueCloudLab/frostfs-sdk-go
Airat Arifullin
ff563851fc
* Make ToV2, FromV2 converters for Patch and PayloadPatch; * Add unit-tests. Signed-off-by: Airat Arifullin <a.arifullin@yadro.com>
103 lines
2.4 KiB
Go
103 lines
2.4 KiB
Go
package object
|
|
|
|
import (
|
|
v2object "git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/object"
|
|
"git.frostfs.info/TrueCloudLab/frostfs-api-go/v2/refs"
|
|
oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
|
|
)
|
|
|
|
// Patch is a patch that's applied for an object.
|
|
type Patch struct {
|
|
// The address of the object for which the patch is being applied.
|
|
Address oid.Address
|
|
|
|
// The list of new attributes to set in the object's header.
|
|
NewAttributes []Attribute
|
|
|
|
// If ReplaceAttributes flag is true, then the header's attributes are reset and
|
|
// filled with NewAttributes. Otherwise, the attributes are just merged.
|
|
ReplaceAttributes bool
|
|
|
|
// Payload patch. If this field is not set, then it assumed such Patch patches only
|
|
// header (see NewAttributes, ReplaceAttributes).
|
|
PayloadPatch *PayloadPatch
|
|
}
|
|
|
|
func (p *Patch) ToV2() *v2object.PatchRequestBody {
|
|
if p == nil {
|
|
return nil
|
|
}
|
|
|
|
v2 := new(v2object.PatchRequestBody)
|
|
|
|
addrV2 := new(refs.Address)
|
|
p.Address.WriteToV2(addrV2)
|
|
v2.SetAddress(addrV2)
|
|
|
|
attrs := make([]v2object.Attribute, len(p.NewAttributes))
|
|
for i := range p.NewAttributes {
|
|
attrs[i] = *p.NewAttributes[i].ToV2()
|
|
}
|
|
v2.SetNewAttributes(attrs)
|
|
v2.SetReplaceAttributes(p.ReplaceAttributes)
|
|
|
|
v2.SetPatch(p.PayloadPatch.ToV2())
|
|
|
|
return v2
|
|
}
|
|
|
|
func (p *Patch) FromV2(patch *v2object.PatchRequestBody) {
|
|
if patch == nil {
|
|
return
|
|
}
|
|
|
|
if addr := patch.GetAddress(); addr != nil {
|
|
_ = p.Address.ReadFromV2(*addr)
|
|
}
|
|
|
|
newAttrs := patch.GetNewAttributes()
|
|
p.NewAttributes = make([]Attribute, len(newAttrs))
|
|
for i := range newAttrs {
|
|
p.NewAttributes[i] = *NewAttributeFromV2(&newAttrs[i])
|
|
}
|
|
|
|
p.ReplaceAttributes = patch.GetReplaceAttributes()
|
|
|
|
if v2patch := patch.GetPatch(); v2patch != nil {
|
|
p.PayloadPatch = new(PayloadPatch)
|
|
p.PayloadPatch.FromV2(v2patch)
|
|
}
|
|
}
|
|
|
|
// Patch is a patch that's applied for an object's payload.
|
|
type PayloadPatch struct {
|
|
// Range of the patch application.
|
|
Range *Range
|
|
|
|
// Chunk is the payload that replaces (or is appended to) the original object payload.
|
|
Chunk []byte
|
|
}
|
|
|
|
func (p *PayloadPatch) ToV2() *v2object.PatchRequestBodyPatch {
|
|
if p == nil {
|
|
return nil
|
|
}
|
|
|
|
v2 := new(v2object.PatchRequestBodyPatch)
|
|
|
|
v2.Chunk = p.Chunk
|
|
v2.Range = p.Range.ToV2()
|
|
|
|
return v2
|
|
}
|
|
|
|
func (p *PayloadPatch) FromV2(patch *v2object.PatchRequestBodyPatch) {
|
|
if patch == nil {
|
|
return
|
|
}
|
|
|
|
p.Chunk = patch.Chunk
|
|
if patch.Range != nil {
|
|
p.Range = NewRangeFromV2(patch.Range)
|
|
}
|
|
}
|