8 "reflect" |
8 "reflect" |
9 "sort" |
9 "sort" |
10 |
10 |
11 "google.golang.org/protobuf/encoding/protowire" |
11 "google.golang.org/protobuf/encoding/protowire" |
12 "google.golang.org/protobuf/internal/genid" |
12 "google.golang.org/protobuf/internal/genid" |
13 pref "google.golang.org/protobuf/reflect/protoreflect" |
13 "google.golang.org/protobuf/reflect/protoreflect" |
14 ) |
14 ) |
15 |
15 |
16 type mapInfo struct { |
16 type mapInfo struct { |
17 goType reflect.Type |
17 goType reflect.Type |
18 keyWiretag uint64 |
18 keyWiretag uint64 |
19 valWiretag uint64 |
19 valWiretag uint64 |
20 keyFuncs valueCoderFuncs |
20 keyFuncs valueCoderFuncs |
21 valFuncs valueCoderFuncs |
21 valFuncs valueCoderFuncs |
22 keyZero pref.Value |
22 keyZero protoreflect.Value |
23 keyKind pref.Kind |
23 keyKind protoreflect.Kind |
24 conv *mapConverter |
24 conv *mapConverter |
25 } |
25 } |
26 |
26 |
27 func encoderFuncsForMap(fd pref.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) { |
27 func encoderFuncsForMap(fd protoreflect.FieldDescriptor, ft reflect.Type) (valueMessage *MessageInfo, funcs pointerCoderFuncs) { |
28 // TODO: Consider generating specialized map coders. |
28 // TODO: Consider generating specialized map coders. |
29 keyField := fd.MapKey() |
29 keyField := fd.MapKey() |
30 valField := fd.MapValue() |
30 valField := fd.MapValue() |
31 keyWiretag := protowire.EncodeTag(1, wireTypes[keyField.Kind()]) |
31 keyWiretag := protowire.EncodeTag(1, wireTypes[keyField.Kind()]) |
32 valWiretag := protowire.EncodeTag(2, wireTypes[valField.Kind()]) |
32 valWiretag := protowire.EncodeTag(2, wireTypes[valField.Kind()]) |
42 valFuncs: valFuncs, |
42 valFuncs: valFuncs, |
43 keyZero: keyField.Default(), |
43 keyZero: keyField.Default(), |
44 keyKind: keyField.Kind(), |
44 keyKind: keyField.Kind(), |
45 conv: conv, |
45 conv: conv, |
46 } |
46 } |
47 if valField.Kind() == pref.MessageKind { |
47 if valField.Kind() == protoreflect.MessageKind { |
48 valueMessage = getMessageInfo(ft.Elem()) |
48 valueMessage = getMessageInfo(ft.Elem()) |
49 } |
49 } |
50 |
50 |
51 funcs = pointerCoderFuncs{ |
51 funcs = pointerCoderFuncs{ |
52 size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int { |
52 size: func(p pointer, f *coderFieldInfo, opts marshalOptions) int { |
66 return consumeMapOfMessage(b, mp.Elem(), wtyp, mapi, f, opts) |
66 return consumeMapOfMessage(b, mp.Elem(), wtyp, mapi, f, opts) |
67 } |
67 } |
68 }, |
68 }, |
69 } |
69 } |
70 switch valField.Kind() { |
70 switch valField.Kind() { |
71 case pref.MessageKind: |
71 case protoreflect.MessageKind: |
72 funcs.merge = mergeMapOfMessage |
72 funcs.merge = mergeMapOfMessage |
73 case pref.BytesKind: |
73 case protoreflect.BytesKind: |
74 funcs.merge = mergeMapOfBytes |
74 funcs.merge = mergeMapOfBytes |
75 default: |
75 default: |
76 funcs.merge = mergeMap |
76 funcs.merge = mergeMap |
77 } |
77 } |
78 if valFuncs.isInit != nil { |
78 if valFuncs.isInit != nil { |
133 } |
133 } |
134 b = b[n:] |
134 b = b[n:] |
135 err := errUnknown |
135 err := errUnknown |
136 switch num { |
136 switch num { |
137 case genid.MapEntry_Key_field_number: |
137 case genid.MapEntry_Key_field_number: |
138 var v pref.Value |
138 var v protoreflect.Value |
139 var o unmarshalOutput |
139 var o unmarshalOutput |
140 v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) |
140 v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) |
141 if err != nil { |
141 if err != nil { |
142 break |
142 break |
143 } |
143 } |
144 key = v |
144 key = v |
145 n = o.n |
145 n = o.n |
146 case genid.MapEntry_Value_field_number: |
146 case genid.MapEntry_Value_field_number: |
147 var v pref.Value |
147 var v protoreflect.Value |
148 var o unmarshalOutput |
148 var o unmarshalOutput |
149 v, o, err = mapi.valFuncs.unmarshal(b, val, num, wtyp, opts) |
149 v, o, err = mapi.valFuncs.unmarshal(b, val, num, wtyp, opts) |
150 if err != nil { |
150 if err != nil { |
151 break |
151 break |
152 } |
152 } |
190 } |
190 } |
191 b = b[n:] |
191 b = b[n:] |
192 err := errUnknown |
192 err := errUnknown |
193 switch num { |
193 switch num { |
194 case 1: |
194 case 1: |
195 var v pref.Value |
195 var v protoreflect.Value |
196 var o unmarshalOutput |
196 var o unmarshalOutput |
197 v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) |
197 v, o, err = mapi.keyFuncs.unmarshal(b, key, num, wtyp, opts) |
198 if err != nil { |
198 if err != nil { |
199 break |
199 break |
200 } |
200 } |