11
"google.golang.org/protobuf/proto"
12
"google.golang.org/protobuf/reflect/protoreflect"
13
"google.golang.org/protobuf/runtime/protoiface"
16
type mergeOptions struct{}
18
func (o mergeOptions) Merge(dst, src proto.Message) {
23
func (mi *MessageInfo) merge(in protoiface.MergeInput) protoiface.MergeOutput {
24
dp, ok := mi.getPointer(in.Destination)
26
return protoiface.MergeOutput{}
28
sp, ok := mi.getPointer(in.Source)
30
return protoiface.MergeOutput{}
32
mi.mergePointer(dp, sp, mergeOptions{})
33
return protoiface.MergeOutput{Flags: protoiface.MergeComplete}
36
func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) {
39
panic(fmt.Sprintf("invalid value: merging into nil message"))
44
for _, f := range mi.orderedCoderFields {
45
if f.funcs.merge == nil {
48
sfptr := src.Apply(f.offset)
49
if f.isPointer && sfptr.Elem().IsNil() {
52
f.funcs.merge(dst.Apply(f.offset), sfptr, f, opts)
54
if mi.extensionOffset.IsValid() {
55
sext := src.Apply(mi.extensionOffset).Extensions()
56
dext := dst.Apply(mi.extensionOffset).Extensions()
58
*dext = make(map[int32]ExtensionField)
60
for num, sx := range *sext {
62
xi := getExtensionFieldInfo(xt)
63
if xi.funcs.merge == nil {
67
var dv protoreflect.Value
68
if dx.Type() == sx.Type() {
71
if !dv.IsValid() && xi.unmarshalNeedsValue {
74
dv = xi.funcs.merge(dv, sx.Value(), opts)
79
if mi.unknownOffset.IsValid() {
80
su := mi.getUnknownBytes(src)
81
if su != nil && len(*su) > 0 {
82
du := mi.mutableUnknownBytes(dst)
83
*du = append(*du, *su...)
88
func mergeScalarValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
92
func mergeBytesValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
93
return protoreflect.ValueOfBytes(append(emptyBuf[:], src.Bytes()...))
96
func mergeListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
99
for i, llen := 0, srcl.Len(); i < llen; i++ {
100
dstl.Append(srcl.Get(i))
105
func mergeBytesListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
108
for i, llen := 0, srcl.Len(); i < llen; i++ {
109
sb := srcl.Get(i).Bytes()
110
db := append(emptyBuf[:], sb...)
111
dstl.Append(protoreflect.ValueOfBytes(db))
116
func mergeMessageListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
119
for i, llen := 0, srcl.Len(); i < llen; i++ {
120
sm := srcl.Get(i).Message()
121
dm := proto.Clone(sm.Interface()).ProtoReflect()
122
dstl.Append(protoreflect.ValueOfMessage(dm))
127
func mergeMessageValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value {
128
opts.Merge(dst.Message().Interface(), src.Message().Interface())
132
func mergeMessage(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
134
if dst.Elem().IsNil() {
135
dst.SetPointer(pointerOfValue(reflect.New(f.mi.GoReflectType.Elem())))
137
f.mi.mergePointer(dst.Elem(), src.Elem(), opts)
139
dm := dst.AsValueOf(f.ft).Elem()
140
sm := src.AsValueOf(f.ft).Elem()
142
dm.Set(reflect.New(f.ft.Elem()))
144
opts.Merge(asMessage(dm), asMessage(sm))
148
func mergeMessageSlice(dst, src pointer, f *coderFieldInfo, opts mergeOptions) {
149
for _, sp := range src.PointerSlice() {
150
dm := reflect.New(f.ft.Elem().Elem())
152
f.mi.mergePointer(pointerOfValue(dm), sp, opts)
154
opts.Merge(asMessage(dm), asMessage(sp.AsValueOf(f.ft.Elem().Elem())))
156
dst.AppendPointerSlice(pointerOfValue(dm))
160
func mergeBytes(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
161
*dst.Bytes() = append(emptyBuf[:], *src.Bytes()...)
164
func mergeBytesNoZero(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
167
*dst.Bytes() = append(emptyBuf[:], v...)
171
func mergeBytesSlice(dst, src pointer, _ *coderFieldInfo, _ mergeOptions) {
172
ds := dst.BytesSlice()
173
for _, v := range *src.BytesSlice() {
174
*ds = append(*ds, append(emptyBuf[:], v...))