7 import ( |
7 import ( |
8 "fmt" |
8 "fmt" |
9 "reflect" |
9 "reflect" |
10 |
10 |
11 "google.golang.org/protobuf/proto" |
11 "google.golang.org/protobuf/proto" |
12 pref "google.golang.org/protobuf/reflect/protoreflect" |
12 "google.golang.org/protobuf/reflect/protoreflect" |
13 piface "google.golang.org/protobuf/runtime/protoiface" |
13 "google.golang.org/protobuf/runtime/protoiface" |
14 ) |
14 ) |
15 |
15 |
16 type mergeOptions struct{} |
16 type mergeOptions struct{} |
17 |
17 |
18 func (o mergeOptions) Merge(dst, src proto.Message) { |
18 func (o mergeOptions) Merge(dst, src proto.Message) { |
19 proto.Merge(dst, src) |
19 proto.Merge(dst, src) |
20 } |
20 } |
21 |
21 |
22 // merge is protoreflect.Methods.Merge. |
22 // merge is protoreflect.Methods.Merge. |
23 func (mi *MessageInfo) merge(in piface.MergeInput) piface.MergeOutput { |
23 func (mi *MessageInfo) merge(in protoiface.MergeInput) protoiface.MergeOutput { |
24 dp, ok := mi.getPointer(in.Destination) |
24 dp, ok := mi.getPointer(in.Destination) |
25 if !ok { |
25 if !ok { |
26 return piface.MergeOutput{} |
26 return protoiface.MergeOutput{} |
27 } |
27 } |
28 sp, ok := mi.getPointer(in.Source) |
28 sp, ok := mi.getPointer(in.Source) |
29 if !ok { |
29 if !ok { |
30 return piface.MergeOutput{} |
30 return protoiface.MergeOutput{} |
31 } |
31 } |
32 mi.mergePointer(dp, sp, mergeOptions{}) |
32 mi.mergePointer(dp, sp, mergeOptions{}) |
33 return piface.MergeOutput{Flags: piface.MergeComplete} |
33 return protoiface.MergeOutput{Flags: protoiface.MergeComplete} |
34 } |
34 } |
35 |
35 |
36 func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { |
36 func (mi *MessageInfo) mergePointer(dst, src pointer, opts mergeOptions) { |
37 mi.init() |
37 mi.init() |
38 if dst.IsNil() { |
38 if dst.IsNil() { |
83 *du = append(*du, *su...) |
83 *du = append(*du, *su...) |
84 } |
84 } |
85 } |
85 } |
86 } |
86 } |
87 |
87 |
88 func mergeScalarValue(dst, src pref.Value, opts mergeOptions) pref.Value { |
88 func mergeScalarValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { |
89 return src |
89 return src |
90 } |
90 } |
91 |
91 |
92 func mergeBytesValue(dst, src pref.Value, opts mergeOptions) pref.Value { |
92 func mergeBytesValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { |
93 return pref.ValueOfBytes(append(emptyBuf[:], src.Bytes()...)) |
93 return protoreflect.ValueOfBytes(append(emptyBuf[:], src.Bytes()...)) |
94 } |
94 } |
95 |
95 |
96 func mergeListValue(dst, src pref.Value, opts mergeOptions) pref.Value { |
96 func mergeListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { |
97 dstl := dst.List() |
97 dstl := dst.List() |
98 srcl := src.List() |
98 srcl := src.List() |
99 for i, llen := 0, srcl.Len(); i < llen; i++ { |
99 for i, llen := 0, srcl.Len(); i < llen; i++ { |
100 dstl.Append(srcl.Get(i)) |
100 dstl.Append(srcl.Get(i)) |
101 } |
101 } |
102 return dst |
102 return dst |
103 } |
103 } |
104 |
104 |
105 func mergeBytesListValue(dst, src pref.Value, opts mergeOptions) pref.Value { |
105 func mergeBytesListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { |
106 dstl := dst.List() |
106 dstl := dst.List() |
107 srcl := src.List() |
107 srcl := src.List() |
108 for i, llen := 0, srcl.Len(); i < llen; i++ { |
108 for i, llen := 0, srcl.Len(); i < llen; i++ { |
109 sb := srcl.Get(i).Bytes() |
109 sb := srcl.Get(i).Bytes() |
110 db := append(emptyBuf[:], sb...) |
110 db := append(emptyBuf[:], sb...) |
111 dstl.Append(pref.ValueOfBytes(db)) |
111 dstl.Append(protoreflect.ValueOfBytes(db)) |
112 } |
112 } |
113 return dst |
113 return dst |
114 } |
114 } |
115 |
115 |
116 func mergeMessageListValue(dst, src pref.Value, opts mergeOptions) pref.Value { |
116 func mergeMessageListValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { |
117 dstl := dst.List() |
117 dstl := dst.List() |
118 srcl := src.List() |
118 srcl := src.List() |
119 for i, llen := 0, srcl.Len(); i < llen; i++ { |
119 for i, llen := 0, srcl.Len(); i < llen; i++ { |
120 sm := srcl.Get(i).Message() |
120 sm := srcl.Get(i).Message() |
121 dm := proto.Clone(sm.Interface()).ProtoReflect() |
121 dm := proto.Clone(sm.Interface()).ProtoReflect() |
122 dstl.Append(pref.ValueOfMessage(dm)) |
122 dstl.Append(protoreflect.ValueOfMessage(dm)) |
123 } |
123 } |
124 return dst |
124 return dst |
125 } |
125 } |
126 |
126 |
127 func mergeMessageValue(dst, src pref.Value, opts mergeOptions) pref.Value { |
127 func mergeMessageValue(dst, src protoreflect.Value, opts mergeOptions) protoreflect.Value { |
128 opts.Merge(dst.Message().Interface(), src.Message().Interface()) |
128 opts.Merge(dst.Message().Interface(), src.Message().Interface()) |
129 return dst |
129 return dst |
130 } |
130 } |
131 |
131 |
132 func mergeMessage(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { |
132 func mergeMessage(dst, src pointer, f *coderFieldInfo, opts mergeOptions) { |