From 9b90d139c5f030d7c7f0be1bddb00f31cab5f404 Mon Sep 17 00:00:00 2001 From: Airat Arifullin Date: Wed, 24 Jul 2024 17:40:47 +0300 Subject: [PATCH] [#94] object: Generate protobufs for `Patch` method * Generate protobufs for patch method; * Create marshalers, unmarshalers, converters for gererated types; * Add unit-tests. Signed-off-by: Airat Arifullin --- object/convert.go | 214 +++++++++++++++++++++++++++++++++ object/grpc/service.go | 52 ++++++++ object/grpc/service.pb.go | Bin 148482 -> 167583 bytes object/grpc/service_grpc.pb.go | Bin 39905 -> 46612 bytes object/marshal.go | 112 +++++++++++++++++ object/message_test.go | 5 + object/test/generate.go | 57 +++++++++ object/types.go | 32 +++++ util/proto/test/test.pb.go | Bin 14249 -> 14249 bytes 9 files changed, 472 insertions(+) diff --git a/object/convert.go b/object/convert.go index 6e8ecff..1abfb5e 100644 --- a/object/convert.go +++ b/object/convert.go @@ -2345,3 +2345,217 @@ func (r *PutSingleResponse) FromGRPCMessage(m grpc.Message) error { return r.ResponseHeaders.FromMessage(v) } + +func (r *PatchRequestBodyPatch) ToGRPCMessage() grpc.Message { + var m *object.PatchRequest_Body_Patch + + if r != nil { + m = new(object.PatchRequest_Body_Patch) + + m.SetSourceRange(r.Range.ToGRPCMessage().(*object.Range)) + m.SetChunk(r.Chunk) + } + + return m +} + +func (r *PatchRequestBodyPatch) FromGRPCMessage(m grpc.Message) error { + v, ok := m.(*object.PatchRequest_Body_Patch) + if !ok { + return message.NewUnexpectedMessageType(m, v) + } + + var err error + + srcRange := v.GetSourceRange() + if srcRange == nil { + r.Range = nil + } else { + if r.Range == nil { + r.Range = new(Range) + } + + err = r.Range.FromGRPCMessage(srcRange) + if err != nil { + return err + } + } + + r.Chunk = v.GetChunk() + + return nil +} + +func (r *PatchRequestBody) ToGRPCMessage() grpc.Message { + var m *object.PatchRequest_Body + + if r != nil { + m = new(object.PatchRequest_Body) + + m.SetAddress(r.Address.ToGRPCMessage().(*refsGRPC.Address)) + m.SetNewAttributes(AttributesToGRPC(r.NewAttributes)) + m.SetReplaceAttributes(r.ReplaceAttributes) + m.SetPatch(r.Patch.ToGRPCMessage().(*object.PatchRequest_Body_Patch)) + } + + return m +} + +func (r *PatchRequestBody) FromGRPCMessage(m grpc.Message) error { + v, ok := m.(*object.PatchRequest_Body) + if !ok { + return message.NewUnexpectedMessageType(m, v) + } + + var err error + + addr := v.GetAddress() + if addr == nil { + r.Address = nil + } else { + if r.Address == nil { + r.Address = new(refs.Address) + } + + err = r.Address.FromGRPCMessage(addr) + if err != nil { + return err + } + } + + r.NewAttributes, err = AttributesFromGRPC(v.GetNewAttributes()) + if err != nil { + return err + } + + r.ReplaceAttributes = v.GetReplaceAttributes() + + patch := v.GetPatch() + if patch == nil { + r.Patch = nil + } else { + if r.Patch == nil { + r.Patch = new(PatchRequestBodyPatch) + } + + err = r.Patch.FromGRPCMessage(patch) + if err != nil { + return err + } + } + + return nil +} + +func (r *PatchRequest) ToGRPCMessage() grpc.Message { + var m *object.PatchRequest + + if r != nil { + m = new(object.PatchRequest) + + m.SetBody(r.Body.ToGRPCMessage().(*object.PatchRequest_Body)) + r.RequestHeaders.ToMessage(m) + } + + return m +} + +func (r *PatchRequest) FromGRPCMessage(m grpc.Message) error { + v, ok := m.(*object.PatchRequest) + if !ok { + return message.NewUnexpectedMessageType(m, v) + } + + var err error + + body := v.GetBody() + if body == nil { + r.Body = nil + } else { + if r.Body == nil { + r.Body = new(PatchRequestBody) + } + + err = r.Body.FromGRPCMessage(body) + if err != nil { + return err + } + } + + return r.RequestHeaders.FromMessage(v) +} + +func (r *PatchResponseBody) ToGRPCMessage() grpc.Message { + var m *object.PatchResponse_Body + + if r != nil { + m = new(object.PatchResponse_Body) + + m.SetObjectID(r.ObjectID.ToGRPCMessage().(*refsGRPC.ObjectID)) + } + + return m +} + +func (r *PatchResponseBody) FromGRPCMessage(m grpc.Message) error { + v, ok := m.(*object.PatchResponse_Body) + if !ok { + return message.NewUnexpectedMessageType(m, v) + } + + var err error + + objID := v.GetObjectId() + if objID == nil { + r.ObjectID = nil + } else { + if r.ObjectID == nil { + r.ObjectID = new(refs.ObjectID) + } + + err = r.ObjectID.FromGRPCMessage(objID) + if err != nil { + return err + } + } + + return nil +} + +func (r *PatchResponse) ToGRPCMessage() grpc.Message { + var m *object.PatchResponse + + if r != nil { + m = new(object.PatchResponse) + + m.SetBody(r.Body.ToGRPCMessage().(*object.PatchResponse_Body)) + r.ResponseHeaders.ToMessage(m) + } + + return m +} + +func (r *PatchResponse) FromGRPCMessage(m grpc.Message) error { + v, ok := m.(*object.PatchResponse) + if !ok { + return message.NewUnexpectedMessageType(m, v) + } + + var err error + + body := v.GetBody() + if body == nil { + r.Body = nil + } else { + if r.Body == nil { + r.Body = new(PatchResponseBody) + } + + err = r.Body.FromGRPCMessage(body) + if err != nil { + return err + } + } + + return r.ResponseHeaders.FromMessage(v) +} diff --git a/object/grpc/service.go b/object/grpc/service.go index 3ff1f3a..ef6422e 100644 --- a/object/grpc/service.go +++ b/object/grpc/service.go @@ -556,3 +556,55 @@ func (m *PutSingleResponse) SetMetaHeader(v *session.ResponseMetaHeader) { func (m *PutSingleResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { m.VerifyHeader = v } + +func (m *PatchRequest_Body) SetAddress(addr *refs.Address) { + m.Address = addr +} + +func (m *PatchRequest_Body) SetNewAttributes(attrs []*Header_Attribute) { + m.NewAttributes = attrs +} + +func (m *PatchRequest_Body) SetReplaceAttributes(replaceAttributes bool) { + m.ReplaceAttributes = replaceAttributes +} + +func (m *PatchRequest_Body) SetPatch(patch *PatchRequest_Body_Patch) { + m.Patch = patch +} + +func (m *PatchRequest_Body_Patch) SetSourceRange(r *Range) { + m.SourceRange = r +} + +func (m *PatchRequest_Body_Patch) SetChunk(chunk []byte) { + m.Chunk = chunk +} + +func (m *PatchRequest) SetBody(b *PatchRequest_Body) { + m.Body = b +} + +func (m *PatchRequest) SetMetaHeader(v *session.RequestMetaHeader) { + m.MetaHeader = v +} + +func (m *PatchRequest) SetVerifyHeader(v *session.RequestVerificationHeader) { + m.VerifyHeader = v +} + +func (m *PatchResponse_Body) SetObjectID(objectID *refs.ObjectID) { + m.ObjectId = objectID +} + +func (m *PatchResponse) SetBody(b *PatchResponse_Body) { + m.Body = b +} + +func (m *PatchResponse) SetMetaHeader(v *session.ResponseMetaHeader) { + m.MetaHeader = v +} + +func (m *PatchResponse) SetVerifyHeader(v *session.ResponseVerificationHeader) { + m.VerifyHeader = v +} diff --git a/object/grpc/service.pb.go b/object/grpc/service.pb.go index 01ba86fc9600fe4dae691b37cf5fd0aab4a199b9..979c932883f20b823ca3680f998bd6707ed77370 100644 GIT binary patch delta 9897 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 delta 4557 zcmZWs32>BE60X;C{WF=FOhOXCT$2l!FiGaV0?8l{AdrJIi9rqpgs?(D39y<&OHqQm zL7t{@RSs)CK;n@-T21 zKWljKQT@KzPjqej^9tZ?Pic5~>q1_=Le0Zk?Uvm-o_TsaU$-j(e@SN6s0=gm*&MR% z>k98Wsp7ZqSRy-gykh39m&WsBuXgh1clPn{E(-Qm9IxoH@t$>R-u#xat7Gq725x$> zfiF1tBd>qy>#p!yX=-kHbuo7gHSm+~D*3{vG<^GC4E(998NBDicudP@wS2*zzOIgU z78>}E2Ndi1AAZZ{yxGe;-ihY}?`pcrPKMQd?$HK5@X1$v_uF6dTYEg*krnsar!N2> zII);7I4|*VzJ{+nEz+DPnVPFD7rE7D>bm^7QN=fWB8-0E|2);p_c_g7lY5HP{DsdJ z^VU!tZ~RID*VmWGpT3&L=l3q-*G~8HaKE;zt8bQ?|8h=M82 z8`&PWX_zsx$H2Z<@#8<;%^Ppi@|CkRy!p~ZoFC7g<=H>?^TT!8$Yl!)sBxd3sd2Kz z#1su^7|x9H43D%*TbAlDemK*KS#A_|z5M81@qGJIO{94!vuf};Gh0kv7Ib7XojgnO z!Ueg^#9L13FmpB=ifv9NVYijV1|$GZp1(Fuv8ArejU?FF8Z|zfMiCtzHYAEC39mZ{ zT-zzlAfDBDEuHm8DA*Pa8f{d=yiFDi2g!`si;f`MiEHu+=b?=j-uRG)AL_H==rD_m zTo1A50XH~gmpIHAOO+CZg-aZ+EMZ&mic|KBO9Xz z;x!YD9<*>{%bhGv9}tKfPD13+5u#zQv*q~N!z>H+68QcXU`%1b9ZQ)N40?1t!IGH= z_qVY$^y;AiAKTBS;T}CCcfLw&%h|~Cl{$VB%7GVHnNX(Uix%+U0Rt4sb@&3ArZG4!Hw6unMLgsUAe>4-u_N`Qz zMMJp%-^48=WIp_E0~?J4O)P`b)(U66NYQh9cmJ(XgT%3a+a_0I_wm0X9C#p{(rGtK>)dkT}fbLRy>si zUbG~E8i#zuhFM%o#5ld4L7I7!!7BhQPo@ArC4mK>PlgdfazaRYz9RM*Q$U{OsstFJ zUbv9jSev4F{V_#Oa)6HbLo!iGHIy0_sbk5J!l596&h57unij6+`+KaB+lRwp4Ia#d ze4Lm`W{xq0>RKiQ@rl7>l@*GyHxq_qwH4y9Y9jTZ%L+y4w^G&Bw}7EDi-^%4J7HrP z@wqmOn)alZECwb~1$(o|;RpFR159{bcx=iN+8H2WIF&s1x

vuSkaWkoj0T0CMk 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