blob: a33292251c420b358058a8ed005a294068499b5e [file] [log] [blame]
Damien Neilc37adef2019-04-01 13:49:56 -07001// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package impl
6
7import (
8 "fmt"
9 "reflect"
10
Damien Neile91877d2019-06-27 10:54:42 -070011 "google.golang.org/protobuf/internal/encoding/wire"
Joe Tsaic51e2e02019-07-13 00:44:41 -070012 "google.golang.org/protobuf/internal/strs"
Damien Neilc37adef2019-04-01 13:49:56 -070013 pref "google.golang.org/protobuf/reflect/protoreflect"
14)
15
16// pointerCoderFuncs is a set of pointer encoding functions.
17type pointerCoderFuncs struct {
Damien Neile91877d2019-06-27 10:54:42 -070018 size func(p pointer, tagsize int, opts marshalOptions) int
19 marshal func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error)
20 unmarshal func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error)
21 isInit func(p pointer) error
Damien Neilc37adef2019-04-01 13:49:56 -070022}
23
Damien Neil68b81c32019-08-22 11:41:32 -070024// valueCoderFuncs is a set of protoreflect.Value encoding functions.
25type valueCoderFuncs struct {
26 size func(v pref.Value, tagsize int, opts marshalOptions) int
27 marshal func(b []byte, v pref.Value, wiretag uint64, opts marshalOptions) ([]byte, error)
28 unmarshal func(b []byte, v pref.Value, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (pref.Value, int, error)
29 isInit func(v pref.Value) error
Damien Neilc37adef2019-04-01 13:49:56 -070030}
31
32// fieldCoder returns pointer functions for a field, used for operating on
33// struct fields.
34func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
35 switch {
Damien Neil4ae30bb2019-06-20 10:12:23 -070036 case fd.IsMap():
37 return encoderFuncsForMap(fd, ft)
Damien Neilc37adef2019-04-01 13:49:56 -070038 case fd.Cardinality() == pref.Repeated && !fd.IsPacked():
39 // Repeated fields (not packed).
40 if ft.Kind() != reflect.Slice {
41 break
42 }
43 ft := ft.Elem()
44 switch fd.Kind() {
45 case pref.BoolKind:
46 if ft.Kind() == reflect.Bool {
47 return coderBoolSlice
48 }
49 case pref.EnumKind:
50 if ft.Kind() == reflect.Int32 {
51 return coderEnumSlice
52 }
53 case pref.Int32Kind:
54 if ft.Kind() == reflect.Int32 {
55 return coderInt32Slice
56 }
57 case pref.Sint32Kind:
58 if ft.Kind() == reflect.Int32 {
59 return coderSint32Slice
60 }
61 case pref.Uint32Kind:
62 if ft.Kind() == reflect.Uint32 {
63 return coderUint32Slice
64 }
65 case pref.Int64Kind:
66 if ft.Kind() == reflect.Int64 {
67 return coderInt64Slice
68 }
69 case pref.Sint64Kind:
70 if ft.Kind() == reflect.Int64 {
71 return coderSint64Slice
72 }
73 case pref.Uint64Kind:
74 if ft.Kind() == reflect.Uint64 {
75 return coderUint64Slice
76 }
77 case pref.Sfixed32Kind:
78 if ft.Kind() == reflect.Int32 {
79 return coderSfixed32Slice
80 }
81 case pref.Fixed32Kind:
82 if ft.Kind() == reflect.Uint32 {
83 return coderFixed32Slice
84 }
85 case pref.FloatKind:
86 if ft.Kind() == reflect.Float32 {
87 return coderFloatSlice
88 }
89 case pref.Sfixed64Kind:
90 if ft.Kind() == reflect.Int64 {
91 return coderSfixed64Slice
92 }
93 case pref.Fixed64Kind:
94 if ft.Kind() == reflect.Uint64 {
95 return coderFixed64Slice
96 }
97 case pref.DoubleKind:
98 if ft.Kind() == reflect.Float64 {
99 return coderDoubleSlice
100 }
101 case pref.StringKind:
Joe Tsaic51e2e02019-07-13 00:44:41 -0700102 if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
Damien Neilc37adef2019-04-01 13:49:56 -0700103 return coderStringSliceValidateUTF8
104 }
105 if ft.Kind() == reflect.String {
106 return coderStringSlice
107 }
Joe Tsaic51e2e02019-07-13 00:44:41 -0700108 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) {
109 return coderBytesSliceValidateUTF8
110 }
Damien Neilc37adef2019-04-01 13:49:56 -0700111 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
112 return coderBytesSlice
113 }
114 case pref.BytesKind:
115 if ft.Kind() == reflect.String {
116 return coderStringSlice
117 }
118 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
119 return coderBytesSlice
120 }
121 case pref.MessageKind:
122 return makeMessageSliceFieldCoder(fd, ft)
123 case pref.GroupKind:
124 return makeGroupSliceFieldCoder(fd, ft)
125 }
126 case fd.Cardinality() == pref.Repeated && fd.IsPacked():
127 // Packed repeated fields.
128 //
129 // Only repeated fields of primitive numeric types
130 // (Varint, Fixed32, or Fixed64 wire type) can be packed.
131 if ft.Kind() != reflect.Slice {
132 break
133 }
134 ft := ft.Elem()
135 switch fd.Kind() {
136 case pref.BoolKind:
137 if ft.Kind() == reflect.Bool {
138 return coderBoolPackedSlice
139 }
140 case pref.EnumKind:
141 if ft.Kind() == reflect.Int32 {
142 return coderEnumPackedSlice
143 }
144 case pref.Int32Kind:
145 if ft.Kind() == reflect.Int32 {
146 return coderInt32PackedSlice
147 }
148 case pref.Sint32Kind:
149 if ft.Kind() == reflect.Int32 {
150 return coderSint32PackedSlice
151 }
152 case pref.Uint32Kind:
153 if ft.Kind() == reflect.Uint32 {
154 return coderUint32PackedSlice
155 }
156 case pref.Int64Kind:
157 if ft.Kind() == reflect.Int64 {
158 return coderInt64PackedSlice
159 }
160 case pref.Sint64Kind:
161 if ft.Kind() == reflect.Int64 {
162 return coderSint64PackedSlice
163 }
164 case pref.Uint64Kind:
165 if ft.Kind() == reflect.Uint64 {
166 return coderUint64PackedSlice
167 }
168 case pref.Sfixed32Kind:
169 if ft.Kind() == reflect.Int32 {
170 return coderSfixed32PackedSlice
171 }
172 case pref.Fixed32Kind:
173 if ft.Kind() == reflect.Uint32 {
174 return coderFixed32PackedSlice
175 }
176 case pref.FloatKind:
177 if ft.Kind() == reflect.Float32 {
178 return coderFloatPackedSlice
179 }
180 case pref.Sfixed64Kind:
181 if ft.Kind() == reflect.Int64 {
182 return coderSfixed64PackedSlice
183 }
184 case pref.Fixed64Kind:
185 if ft.Kind() == reflect.Uint64 {
186 return coderFixed64PackedSlice
187 }
188 case pref.DoubleKind:
189 if ft.Kind() == reflect.Float64 {
190 return coderDoublePackedSlice
191 }
192 }
193 case fd.Kind() == pref.MessageKind:
194 return makeMessageFieldCoder(fd, ft)
195 case fd.Kind() == pref.GroupKind:
196 return makeGroupFieldCoder(fd, ft)
197 case fd.Syntax() == pref.Proto3 && fd.ContainingOneof() == nil:
198 // Populated oneof fields always encode even if set to the zero value,
199 // which normally are not encoded in proto3.
200 switch fd.Kind() {
201 case pref.BoolKind:
202 if ft.Kind() == reflect.Bool {
203 return coderBoolNoZero
204 }
205 case pref.EnumKind:
206 if ft.Kind() == reflect.Int32 {
207 return coderEnumNoZero
208 }
209 case pref.Int32Kind:
210 if ft.Kind() == reflect.Int32 {
211 return coderInt32NoZero
212 }
213 case pref.Sint32Kind:
214 if ft.Kind() == reflect.Int32 {
215 return coderSint32NoZero
216 }
217 case pref.Uint32Kind:
218 if ft.Kind() == reflect.Uint32 {
219 return coderUint32NoZero
220 }
221 case pref.Int64Kind:
222 if ft.Kind() == reflect.Int64 {
223 return coderInt64NoZero
224 }
225 case pref.Sint64Kind:
226 if ft.Kind() == reflect.Int64 {
227 return coderSint64NoZero
228 }
229 case pref.Uint64Kind:
230 if ft.Kind() == reflect.Uint64 {
231 return coderUint64NoZero
232 }
233 case pref.Sfixed32Kind:
234 if ft.Kind() == reflect.Int32 {
235 return coderSfixed32NoZero
236 }
237 case pref.Fixed32Kind:
238 if ft.Kind() == reflect.Uint32 {
239 return coderFixed32NoZero
240 }
241 case pref.FloatKind:
242 if ft.Kind() == reflect.Float32 {
243 return coderFloatNoZero
244 }
245 case pref.Sfixed64Kind:
246 if ft.Kind() == reflect.Int64 {
247 return coderSfixed64NoZero
248 }
249 case pref.Fixed64Kind:
250 if ft.Kind() == reflect.Uint64 {
251 return coderFixed64NoZero
252 }
253 case pref.DoubleKind:
254 if ft.Kind() == reflect.Float64 {
255 return coderDoubleNoZero
256 }
257 case pref.StringKind:
Joe Tsaic51e2e02019-07-13 00:44:41 -0700258 if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
Damien Neilc37adef2019-04-01 13:49:56 -0700259 return coderStringNoZeroValidateUTF8
260 }
Joe Tsaic51e2e02019-07-13 00:44:41 -0700261 if ft.Kind() == reflect.String {
262 return coderStringNoZero
263 }
264 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) {
265 return coderBytesNoZeroValidateUTF8
266 }
Damien Neilc37adef2019-04-01 13:49:56 -0700267 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
268 return coderBytesNoZero
269 }
270 case pref.BytesKind:
271 if ft.Kind() == reflect.String {
272 return coderStringNoZero
273 }
274 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
275 return coderBytesNoZero
276 }
277 }
278 case ft.Kind() == reflect.Ptr:
279 ft := ft.Elem()
280 switch fd.Kind() {
281 case pref.BoolKind:
282 if ft.Kind() == reflect.Bool {
283 return coderBoolPtr
284 }
285 case pref.EnumKind:
286 if ft.Kind() == reflect.Int32 {
287 return coderEnumPtr
288 }
289 case pref.Int32Kind:
290 if ft.Kind() == reflect.Int32 {
291 return coderInt32Ptr
292 }
293 case pref.Sint32Kind:
294 if ft.Kind() == reflect.Int32 {
295 return coderSint32Ptr
296 }
297 case pref.Uint32Kind:
298 if ft.Kind() == reflect.Uint32 {
299 return coderUint32Ptr
300 }
301 case pref.Int64Kind:
302 if ft.Kind() == reflect.Int64 {
303 return coderInt64Ptr
304 }
305 case pref.Sint64Kind:
306 if ft.Kind() == reflect.Int64 {
307 return coderSint64Ptr
308 }
309 case pref.Uint64Kind:
310 if ft.Kind() == reflect.Uint64 {
311 return coderUint64Ptr
312 }
313 case pref.Sfixed32Kind:
314 if ft.Kind() == reflect.Int32 {
315 return coderSfixed32Ptr
316 }
317 case pref.Fixed32Kind:
318 if ft.Kind() == reflect.Uint32 {
319 return coderFixed32Ptr
320 }
321 case pref.FloatKind:
322 if ft.Kind() == reflect.Float32 {
323 return coderFloatPtr
324 }
325 case pref.Sfixed64Kind:
326 if ft.Kind() == reflect.Int64 {
327 return coderSfixed64Ptr
328 }
329 case pref.Fixed64Kind:
330 if ft.Kind() == reflect.Uint64 {
331 return coderFixed64Ptr
332 }
333 case pref.DoubleKind:
334 if ft.Kind() == reflect.Float64 {
335 return coderDoublePtr
336 }
337 case pref.StringKind:
338 if ft.Kind() == reflect.String {
339 return coderStringPtr
340 }
341 case pref.BytesKind:
342 if ft.Kind() == reflect.String {
343 return coderStringPtr
344 }
345 }
346 default:
347 switch fd.Kind() {
348 case pref.BoolKind:
349 if ft.Kind() == reflect.Bool {
350 return coderBool
351 }
352 case pref.EnumKind:
353 if ft.Kind() == reflect.Int32 {
354 return coderEnum
355 }
356 case pref.Int32Kind:
357 if ft.Kind() == reflect.Int32 {
358 return coderInt32
359 }
360 case pref.Sint32Kind:
361 if ft.Kind() == reflect.Int32 {
362 return coderSint32
363 }
364 case pref.Uint32Kind:
365 if ft.Kind() == reflect.Uint32 {
366 return coderUint32
367 }
368 case pref.Int64Kind:
369 if ft.Kind() == reflect.Int64 {
370 return coderInt64
371 }
372 case pref.Sint64Kind:
373 if ft.Kind() == reflect.Int64 {
374 return coderSint64
375 }
376 case pref.Uint64Kind:
377 if ft.Kind() == reflect.Uint64 {
378 return coderUint64
379 }
380 case pref.Sfixed32Kind:
381 if ft.Kind() == reflect.Int32 {
382 return coderSfixed32
383 }
384 case pref.Fixed32Kind:
385 if ft.Kind() == reflect.Uint32 {
386 return coderFixed32
387 }
388 case pref.FloatKind:
389 if ft.Kind() == reflect.Float32 {
390 return coderFloat
391 }
392 case pref.Sfixed64Kind:
393 if ft.Kind() == reflect.Int64 {
394 return coderSfixed64
395 }
396 case pref.Fixed64Kind:
397 if ft.Kind() == reflect.Uint64 {
398 return coderFixed64
399 }
400 case pref.DoubleKind:
401 if ft.Kind() == reflect.Float64 {
402 return coderDouble
403 }
404 case pref.StringKind:
Joe Tsaic51e2e02019-07-13 00:44:41 -0700405 if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
Damien Neilc37adef2019-04-01 13:49:56 -0700406 return coderStringValidateUTF8
407 }
408 if ft.Kind() == reflect.String {
409 return coderString
410 }
Joe Tsaic51e2e02019-07-13 00:44:41 -0700411 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) {
412 return coderBytesValidateUTF8
413 }
Damien Neilc37adef2019-04-01 13:49:56 -0700414 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
415 return coderBytes
416 }
417 case pref.BytesKind:
418 if ft.Kind() == reflect.String {
419 return coderString
420 }
421 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
422 return coderBytes
423 }
424 }
425 }
426 panic(fmt.Errorf("invalid type: no encoder for %v %v %v/%v", fd.FullName(), fd.Cardinality(), fd.Kind(), ft))
427}
428
429// encoderFuncsForValue returns interface{} value functions for a field, used for
430// extension values and map encoding.
Damien Neil68b81c32019-08-22 11:41:32 -0700431func encoderFuncsForValue(fd pref.FieldDescriptor, ft reflect.Type) valueCoderFuncs {
Damien Neilc37adef2019-04-01 13:49:56 -0700432 switch {
433 case fd.Cardinality() == pref.Repeated && !fd.IsPacked():
Damien Neil293dc762019-08-29 11:42:57 -0700434 if ft.Kind() == reflect.Ptr {
435 ft = ft.Elem()
436 }
437 if ft.Kind() != reflect.Slice {
Damien Neilc37adef2019-04-01 13:49:56 -0700438 break
439 }
Damien Neil293dc762019-08-29 11:42:57 -0700440 ft := ft.Elem()
Damien Neilc37adef2019-04-01 13:49:56 -0700441 switch fd.Kind() {
442 case pref.BoolKind:
443 if ft.Kind() == reflect.Bool {
Damien Neil68b81c32019-08-22 11:41:32 -0700444 return coderBoolSliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700445 }
446 case pref.EnumKind:
447 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700448 return coderEnumSliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700449 }
450 case pref.Int32Kind:
451 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700452 return coderInt32SliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700453 }
454 case pref.Sint32Kind:
455 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700456 return coderSint32SliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700457 }
458 case pref.Uint32Kind:
459 if ft.Kind() == reflect.Uint32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700460 return coderUint32SliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700461 }
462 case pref.Int64Kind:
463 if ft.Kind() == reflect.Int64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700464 return coderInt64SliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700465 }
466 case pref.Sint64Kind:
467 if ft.Kind() == reflect.Int64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700468 return coderSint64SliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700469 }
470 case pref.Uint64Kind:
471 if ft.Kind() == reflect.Uint64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700472 return coderUint64SliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700473 }
474 case pref.Sfixed32Kind:
475 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700476 return coderSfixed32SliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700477 }
478 case pref.Fixed32Kind:
479 if ft.Kind() == reflect.Uint32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700480 return coderFixed32SliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700481 }
482 case pref.FloatKind:
483 if ft.Kind() == reflect.Float32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700484 return coderFloatSliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700485 }
486 case pref.Sfixed64Kind:
487 if ft.Kind() == reflect.Int64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700488 return coderSfixed64SliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700489 }
490 case pref.Fixed64Kind:
491 if ft.Kind() == reflect.Uint64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700492 return coderFixed64SliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700493 }
494 case pref.DoubleKind:
495 if ft.Kind() == reflect.Float64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700496 return coderDoubleSliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700497 }
498 case pref.StringKind:
499 if ft.Kind() == reflect.String {
Damien Neil68b81c32019-08-22 11:41:32 -0700500 return coderStringSliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700501 }
502 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
Damien Neil68b81c32019-08-22 11:41:32 -0700503 return coderBytesSliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700504 }
505 case pref.BytesKind:
506 if ft.Kind() == reflect.String {
Damien Neil68b81c32019-08-22 11:41:32 -0700507 return coderStringSliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700508 }
509 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
Damien Neil68b81c32019-08-22 11:41:32 -0700510 return coderBytesSliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700511 }
512 case pref.MessageKind:
Damien Neil68b81c32019-08-22 11:41:32 -0700513 return coderMessageSliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700514 case pref.GroupKind:
Damien Neil68b81c32019-08-22 11:41:32 -0700515 return coderGroupSliceValue
Damien Neilc37adef2019-04-01 13:49:56 -0700516 }
517 case fd.Cardinality() == pref.Repeated && fd.IsPacked():
Damien Neil293dc762019-08-29 11:42:57 -0700518 if ft.Kind() == reflect.Ptr {
519 ft = ft.Elem()
520 }
521 if ft.Kind() != reflect.Slice {
Damien Neil7492a092019-07-10 15:23:29 -0700522 break
523 }
Damien Neil293dc762019-08-29 11:42:57 -0700524 ft := ft.Elem()
Damien Neil7492a092019-07-10 15:23:29 -0700525 switch fd.Kind() {
526 case pref.BoolKind:
527 if ft.Kind() == reflect.Bool {
Damien Neil68b81c32019-08-22 11:41:32 -0700528 return coderBoolPackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700529 }
530 case pref.EnumKind:
531 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700532 return coderEnumPackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700533 }
534 case pref.Int32Kind:
535 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700536 return coderInt32PackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700537 }
538 case pref.Sint32Kind:
539 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700540 return coderSint32PackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700541 }
542 case pref.Uint32Kind:
543 if ft.Kind() == reflect.Uint32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700544 return coderUint32PackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700545 }
546 case pref.Int64Kind:
547 if ft.Kind() == reflect.Int64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700548 return coderInt64PackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700549 }
550 case pref.Sint64Kind:
551 if ft.Kind() == reflect.Int64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700552 return coderSint64PackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700553 }
554 case pref.Uint64Kind:
555 if ft.Kind() == reflect.Uint64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700556 return coderUint64PackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700557 }
558 case pref.Sfixed32Kind:
559 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700560 return coderSfixed32PackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700561 }
562 case pref.Fixed32Kind:
563 if ft.Kind() == reflect.Uint32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700564 return coderFixed32PackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700565 }
566 case pref.FloatKind:
567 if ft.Kind() == reflect.Float32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700568 return coderFloatPackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700569 }
570 case pref.Sfixed64Kind:
571 if ft.Kind() == reflect.Int64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700572 return coderSfixed64PackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700573 }
574 case pref.Fixed64Kind:
575 if ft.Kind() == reflect.Uint64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700576 return coderFixed64PackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700577 }
578 case pref.DoubleKind:
579 if ft.Kind() == reflect.Float64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700580 return coderDoublePackedSliceValue
Damien Neil7492a092019-07-10 15:23:29 -0700581 }
582 }
Damien Neilc37adef2019-04-01 13:49:56 -0700583 default:
584 switch fd.Kind() {
Damien Neil68b81c32019-08-22 11:41:32 -0700585 default:
Damien Neilc37adef2019-04-01 13:49:56 -0700586 case pref.BoolKind:
587 if ft.Kind() == reflect.Bool {
Damien Neil68b81c32019-08-22 11:41:32 -0700588 return coderBoolValue
Damien Neilc37adef2019-04-01 13:49:56 -0700589 }
590 case pref.EnumKind:
591 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700592 return coderEnumValue
Damien Neilc37adef2019-04-01 13:49:56 -0700593 }
594 case pref.Int32Kind:
595 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700596 return coderInt32Value
Damien Neilc37adef2019-04-01 13:49:56 -0700597 }
598 case pref.Sint32Kind:
599 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700600 return coderSint32Value
Damien Neilc37adef2019-04-01 13:49:56 -0700601 }
602 case pref.Uint32Kind:
603 if ft.Kind() == reflect.Uint32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700604 return coderUint32Value
Damien Neilc37adef2019-04-01 13:49:56 -0700605 }
606 case pref.Int64Kind:
607 if ft.Kind() == reflect.Int64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700608 return coderInt64Value
Damien Neilc37adef2019-04-01 13:49:56 -0700609 }
610 case pref.Sint64Kind:
611 if ft.Kind() == reflect.Int64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700612 return coderSint64Value
Damien Neilc37adef2019-04-01 13:49:56 -0700613 }
614 case pref.Uint64Kind:
615 if ft.Kind() == reflect.Uint64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700616 return coderUint64Value
Damien Neilc37adef2019-04-01 13:49:56 -0700617 }
618 case pref.Sfixed32Kind:
619 if ft.Kind() == reflect.Int32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700620 return coderSfixed32Value
Damien Neilc37adef2019-04-01 13:49:56 -0700621 }
622 case pref.Fixed32Kind:
623 if ft.Kind() == reflect.Uint32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700624 return coderFixed32Value
Damien Neilc37adef2019-04-01 13:49:56 -0700625 }
626 case pref.FloatKind:
627 if ft.Kind() == reflect.Float32 {
Damien Neil68b81c32019-08-22 11:41:32 -0700628 return coderFloatValue
Damien Neilc37adef2019-04-01 13:49:56 -0700629 }
630 case pref.Sfixed64Kind:
631 if ft.Kind() == reflect.Int64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700632 return coderSfixed64Value
Damien Neilc37adef2019-04-01 13:49:56 -0700633 }
634 case pref.Fixed64Kind:
635 if ft.Kind() == reflect.Uint64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700636 return coderFixed64Value
Damien Neilc37adef2019-04-01 13:49:56 -0700637 }
638 case pref.DoubleKind:
639 if ft.Kind() == reflect.Float64 {
Damien Neil68b81c32019-08-22 11:41:32 -0700640 return coderDoubleValue
Damien Neilc37adef2019-04-01 13:49:56 -0700641 }
642 case pref.StringKind:
Joe Tsaic51e2e02019-07-13 00:44:41 -0700643 if ft.Kind() == reflect.String && strs.EnforceUTF8(fd) {
Damien Neil68b81c32019-08-22 11:41:32 -0700644 return coderStringValueValidateUTF8
Damien Neilc37adef2019-04-01 13:49:56 -0700645 }
646 if ft.Kind() == reflect.String {
Damien Neil68b81c32019-08-22 11:41:32 -0700647 return coderStringValue
Damien Neilc37adef2019-04-01 13:49:56 -0700648 }
Joe Tsaic51e2e02019-07-13 00:44:41 -0700649 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 && strs.EnforceUTF8(fd) {
Damien Neil68b81c32019-08-22 11:41:32 -0700650 return coderBytesValueValidateUTF8
Joe Tsaic51e2e02019-07-13 00:44:41 -0700651 }
Damien Neilc37adef2019-04-01 13:49:56 -0700652 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
Damien Neil68b81c32019-08-22 11:41:32 -0700653 return coderBytesValue
Damien Neilc37adef2019-04-01 13:49:56 -0700654 }
655 case pref.BytesKind:
656 if ft.Kind() == reflect.String {
Damien Neil68b81c32019-08-22 11:41:32 -0700657 return coderStringValue
Damien Neilc37adef2019-04-01 13:49:56 -0700658 }
659 if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
Damien Neil68b81c32019-08-22 11:41:32 -0700660 return coderBytesValue
Damien Neilc37adef2019-04-01 13:49:56 -0700661 }
662 case pref.MessageKind:
Damien Neil68b81c32019-08-22 11:41:32 -0700663 return coderMessageValue
Damien Neilc37adef2019-04-01 13:49:56 -0700664 case pref.GroupKind:
Damien Neil68b81c32019-08-22 11:41:32 -0700665 return coderGroupValue
Damien Neilc37adef2019-04-01 13:49:56 -0700666 }
667 }
668 panic(fmt.Errorf("invalid type: no encoder for %v %v %v/%v", fd.FullName(), fd.Cardinality(), fd.Kind(), ft))
669}