codec_tables.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646
  1. // 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. package impl
  5. import (
  6. "fmt"
  7. "reflect"
  8. "google.golang.org/protobuf/internal/encoding/wire"
  9. pref "google.golang.org/protobuf/reflect/protoreflect"
  10. )
  11. // pointerCoderFuncs is a set of pointer encoding functions.
  12. type pointerCoderFuncs struct {
  13. size func(p pointer, tagsize int, opts marshalOptions) int
  14. marshal func(b []byte, p pointer, wiretag uint64, opts marshalOptions) ([]byte, error)
  15. unmarshal func(b []byte, p pointer, wtyp wire.Type, opts unmarshalOptions) (int, error)
  16. isInit func(p pointer) error
  17. }
  18. // ifaceCoderFuncs is a set of interface{} encoding functions.
  19. type ifaceCoderFuncs struct {
  20. size func(ival interface{}, tagsize int, opts marshalOptions) int
  21. marshal func(b []byte, ival interface{}, wiretag uint64, opts marshalOptions) ([]byte, error)
  22. unmarshal func(b []byte, ival interface{}, num wire.Number, wtyp wire.Type, opts unmarshalOptions) (interface{}, int, error)
  23. isInit func(ival interface{}) error
  24. }
  25. // fieldCoder returns pointer functions for a field, used for operating on
  26. // struct fields.
  27. func fieldCoder(fd pref.FieldDescriptor, ft reflect.Type) pointerCoderFuncs {
  28. switch {
  29. case fd.IsMap():
  30. return encoderFuncsForMap(fd, ft)
  31. case fd.Cardinality() == pref.Repeated && !fd.IsPacked():
  32. // Repeated fields (not packed).
  33. if ft.Kind() != reflect.Slice {
  34. break
  35. }
  36. ft := ft.Elem()
  37. switch fd.Kind() {
  38. case pref.BoolKind:
  39. if ft.Kind() == reflect.Bool {
  40. return coderBoolSlice
  41. }
  42. case pref.EnumKind:
  43. if ft.Kind() == reflect.Int32 {
  44. return coderEnumSlice
  45. }
  46. case pref.Int32Kind:
  47. if ft.Kind() == reflect.Int32 {
  48. return coderInt32Slice
  49. }
  50. case pref.Sint32Kind:
  51. if ft.Kind() == reflect.Int32 {
  52. return coderSint32Slice
  53. }
  54. case pref.Uint32Kind:
  55. if ft.Kind() == reflect.Uint32 {
  56. return coderUint32Slice
  57. }
  58. case pref.Int64Kind:
  59. if ft.Kind() == reflect.Int64 {
  60. return coderInt64Slice
  61. }
  62. case pref.Sint64Kind:
  63. if ft.Kind() == reflect.Int64 {
  64. return coderSint64Slice
  65. }
  66. case pref.Uint64Kind:
  67. if ft.Kind() == reflect.Uint64 {
  68. return coderUint64Slice
  69. }
  70. case pref.Sfixed32Kind:
  71. if ft.Kind() == reflect.Int32 {
  72. return coderSfixed32Slice
  73. }
  74. case pref.Fixed32Kind:
  75. if ft.Kind() == reflect.Uint32 {
  76. return coderFixed32Slice
  77. }
  78. case pref.FloatKind:
  79. if ft.Kind() == reflect.Float32 {
  80. return coderFloatSlice
  81. }
  82. case pref.Sfixed64Kind:
  83. if ft.Kind() == reflect.Int64 {
  84. return coderSfixed64Slice
  85. }
  86. case pref.Fixed64Kind:
  87. if ft.Kind() == reflect.Uint64 {
  88. return coderFixed64Slice
  89. }
  90. case pref.DoubleKind:
  91. if ft.Kind() == reflect.Float64 {
  92. return coderDoubleSlice
  93. }
  94. case pref.StringKind:
  95. if ft.Kind() == reflect.String && fd.Syntax() == pref.Proto3 {
  96. return coderStringSliceValidateUTF8
  97. }
  98. if ft.Kind() == reflect.String {
  99. return coderStringSlice
  100. }
  101. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  102. return coderBytesSlice
  103. }
  104. case pref.BytesKind:
  105. if ft.Kind() == reflect.String {
  106. return coderStringSlice
  107. }
  108. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  109. return coderBytesSlice
  110. }
  111. case pref.MessageKind:
  112. return makeMessageSliceFieldCoder(fd, ft)
  113. case pref.GroupKind:
  114. return makeGroupSliceFieldCoder(fd, ft)
  115. }
  116. case fd.Cardinality() == pref.Repeated && fd.IsPacked():
  117. // Packed repeated fields.
  118. //
  119. // Only repeated fields of primitive numeric types
  120. // (Varint, Fixed32, or Fixed64 wire type) can be packed.
  121. if ft.Kind() != reflect.Slice {
  122. break
  123. }
  124. ft := ft.Elem()
  125. switch fd.Kind() {
  126. case pref.BoolKind:
  127. if ft.Kind() == reflect.Bool {
  128. return coderBoolPackedSlice
  129. }
  130. case pref.EnumKind:
  131. if ft.Kind() == reflect.Int32 {
  132. return coderEnumPackedSlice
  133. }
  134. case pref.Int32Kind:
  135. if ft.Kind() == reflect.Int32 {
  136. return coderInt32PackedSlice
  137. }
  138. case pref.Sint32Kind:
  139. if ft.Kind() == reflect.Int32 {
  140. return coderSint32PackedSlice
  141. }
  142. case pref.Uint32Kind:
  143. if ft.Kind() == reflect.Uint32 {
  144. return coderUint32PackedSlice
  145. }
  146. case pref.Int64Kind:
  147. if ft.Kind() == reflect.Int64 {
  148. return coderInt64PackedSlice
  149. }
  150. case pref.Sint64Kind:
  151. if ft.Kind() == reflect.Int64 {
  152. return coderSint64PackedSlice
  153. }
  154. case pref.Uint64Kind:
  155. if ft.Kind() == reflect.Uint64 {
  156. return coderUint64PackedSlice
  157. }
  158. case pref.Sfixed32Kind:
  159. if ft.Kind() == reflect.Int32 {
  160. return coderSfixed32PackedSlice
  161. }
  162. case pref.Fixed32Kind:
  163. if ft.Kind() == reflect.Uint32 {
  164. return coderFixed32PackedSlice
  165. }
  166. case pref.FloatKind:
  167. if ft.Kind() == reflect.Float32 {
  168. return coderFloatPackedSlice
  169. }
  170. case pref.Sfixed64Kind:
  171. if ft.Kind() == reflect.Int64 {
  172. return coderSfixed64PackedSlice
  173. }
  174. case pref.Fixed64Kind:
  175. if ft.Kind() == reflect.Uint64 {
  176. return coderFixed64PackedSlice
  177. }
  178. case pref.DoubleKind:
  179. if ft.Kind() == reflect.Float64 {
  180. return coderDoublePackedSlice
  181. }
  182. }
  183. case fd.Kind() == pref.MessageKind:
  184. return makeMessageFieldCoder(fd, ft)
  185. case fd.Kind() == pref.GroupKind:
  186. return makeGroupFieldCoder(fd, ft)
  187. case fd.Syntax() == pref.Proto3 && fd.ContainingOneof() == nil:
  188. // Populated oneof fields always encode even if set to the zero value,
  189. // which normally are not encoded in proto3.
  190. switch fd.Kind() {
  191. case pref.BoolKind:
  192. if ft.Kind() == reflect.Bool {
  193. return coderBoolNoZero
  194. }
  195. case pref.EnumKind:
  196. if ft.Kind() == reflect.Int32 {
  197. return coderEnumNoZero
  198. }
  199. case pref.Int32Kind:
  200. if ft.Kind() == reflect.Int32 {
  201. return coderInt32NoZero
  202. }
  203. case pref.Sint32Kind:
  204. if ft.Kind() == reflect.Int32 {
  205. return coderSint32NoZero
  206. }
  207. case pref.Uint32Kind:
  208. if ft.Kind() == reflect.Uint32 {
  209. return coderUint32NoZero
  210. }
  211. case pref.Int64Kind:
  212. if ft.Kind() == reflect.Int64 {
  213. return coderInt64NoZero
  214. }
  215. case pref.Sint64Kind:
  216. if ft.Kind() == reflect.Int64 {
  217. return coderSint64NoZero
  218. }
  219. case pref.Uint64Kind:
  220. if ft.Kind() == reflect.Uint64 {
  221. return coderUint64NoZero
  222. }
  223. case pref.Sfixed32Kind:
  224. if ft.Kind() == reflect.Int32 {
  225. return coderSfixed32NoZero
  226. }
  227. case pref.Fixed32Kind:
  228. if ft.Kind() == reflect.Uint32 {
  229. return coderFixed32NoZero
  230. }
  231. case pref.FloatKind:
  232. if ft.Kind() == reflect.Float32 {
  233. return coderFloatNoZero
  234. }
  235. case pref.Sfixed64Kind:
  236. if ft.Kind() == reflect.Int64 {
  237. return coderSfixed64NoZero
  238. }
  239. case pref.Fixed64Kind:
  240. if ft.Kind() == reflect.Uint64 {
  241. return coderFixed64NoZero
  242. }
  243. case pref.DoubleKind:
  244. if ft.Kind() == reflect.Float64 {
  245. return coderDoubleNoZero
  246. }
  247. case pref.StringKind:
  248. if ft.Kind() == reflect.String {
  249. return coderStringNoZeroValidateUTF8
  250. }
  251. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  252. return coderBytesNoZero
  253. }
  254. case pref.BytesKind:
  255. if ft.Kind() == reflect.String {
  256. return coderStringNoZero
  257. }
  258. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  259. return coderBytesNoZero
  260. }
  261. }
  262. case ft.Kind() == reflect.Ptr:
  263. ft := ft.Elem()
  264. switch fd.Kind() {
  265. case pref.BoolKind:
  266. if ft.Kind() == reflect.Bool {
  267. return coderBoolPtr
  268. }
  269. case pref.EnumKind:
  270. if ft.Kind() == reflect.Int32 {
  271. return coderEnumPtr
  272. }
  273. case pref.Int32Kind:
  274. if ft.Kind() == reflect.Int32 {
  275. return coderInt32Ptr
  276. }
  277. case pref.Sint32Kind:
  278. if ft.Kind() == reflect.Int32 {
  279. return coderSint32Ptr
  280. }
  281. case pref.Uint32Kind:
  282. if ft.Kind() == reflect.Uint32 {
  283. return coderUint32Ptr
  284. }
  285. case pref.Int64Kind:
  286. if ft.Kind() == reflect.Int64 {
  287. return coderInt64Ptr
  288. }
  289. case pref.Sint64Kind:
  290. if ft.Kind() == reflect.Int64 {
  291. return coderSint64Ptr
  292. }
  293. case pref.Uint64Kind:
  294. if ft.Kind() == reflect.Uint64 {
  295. return coderUint64Ptr
  296. }
  297. case pref.Sfixed32Kind:
  298. if ft.Kind() == reflect.Int32 {
  299. return coderSfixed32Ptr
  300. }
  301. case pref.Fixed32Kind:
  302. if ft.Kind() == reflect.Uint32 {
  303. return coderFixed32Ptr
  304. }
  305. case pref.FloatKind:
  306. if ft.Kind() == reflect.Float32 {
  307. return coderFloatPtr
  308. }
  309. case pref.Sfixed64Kind:
  310. if ft.Kind() == reflect.Int64 {
  311. return coderSfixed64Ptr
  312. }
  313. case pref.Fixed64Kind:
  314. if ft.Kind() == reflect.Uint64 {
  315. return coderFixed64Ptr
  316. }
  317. case pref.DoubleKind:
  318. if ft.Kind() == reflect.Float64 {
  319. return coderDoublePtr
  320. }
  321. case pref.StringKind:
  322. if ft.Kind() == reflect.String {
  323. return coderStringPtr
  324. }
  325. case pref.BytesKind:
  326. if ft.Kind() == reflect.String {
  327. return coderStringPtr
  328. }
  329. }
  330. default:
  331. switch fd.Kind() {
  332. case pref.BoolKind:
  333. if ft.Kind() == reflect.Bool {
  334. return coderBool
  335. }
  336. case pref.EnumKind:
  337. if ft.Kind() == reflect.Int32 {
  338. return coderEnum
  339. }
  340. case pref.Int32Kind:
  341. if ft.Kind() == reflect.Int32 {
  342. return coderInt32
  343. }
  344. case pref.Sint32Kind:
  345. if ft.Kind() == reflect.Int32 {
  346. return coderSint32
  347. }
  348. case pref.Uint32Kind:
  349. if ft.Kind() == reflect.Uint32 {
  350. return coderUint32
  351. }
  352. case pref.Int64Kind:
  353. if ft.Kind() == reflect.Int64 {
  354. return coderInt64
  355. }
  356. case pref.Sint64Kind:
  357. if ft.Kind() == reflect.Int64 {
  358. return coderSint64
  359. }
  360. case pref.Uint64Kind:
  361. if ft.Kind() == reflect.Uint64 {
  362. return coderUint64
  363. }
  364. case pref.Sfixed32Kind:
  365. if ft.Kind() == reflect.Int32 {
  366. return coderSfixed32
  367. }
  368. case pref.Fixed32Kind:
  369. if ft.Kind() == reflect.Uint32 {
  370. return coderFixed32
  371. }
  372. case pref.FloatKind:
  373. if ft.Kind() == reflect.Float32 {
  374. return coderFloat
  375. }
  376. case pref.Sfixed64Kind:
  377. if ft.Kind() == reflect.Int64 {
  378. return coderSfixed64
  379. }
  380. case pref.Fixed64Kind:
  381. if ft.Kind() == reflect.Uint64 {
  382. return coderFixed64
  383. }
  384. case pref.DoubleKind:
  385. if ft.Kind() == reflect.Float64 {
  386. return coderDouble
  387. }
  388. case pref.StringKind:
  389. if fd.Syntax() == pref.Proto3 && ft.Kind() == reflect.String {
  390. return coderStringValidateUTF8
  391. }
  392. if ft.Kind() == reflect.String {
  393. return coderString
  394. }
  395. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  396. return coderBytes
  397. }
  398. case pref.BytesKind:
  399. if ft.Kind() == reflect.String {
  400. return coderString
  401. }
  402. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  403. return coderBytes
  404. }
  405. }
  406. }
  407. panic(fmt.Errorf("invalid type: no encoder for %v %v %v/%v", fd.FullName(), fd.Cardinality(), fd.Kind(), ft))
  408. }
  409. // encoderFuncsForValue returns interface{} value functions for a field, used for
  410. // extension values and map encoding.
  411. func encoderFuncsForValue(fd pref.FieldDescriptor, ft reflect.Type) ifaceCoderFuncs {
  412. switch {
  413. case fd.Cardinality() == pref.Repeated && !fd.IsPacked():
  414. if ft.Kind() != reflect.Ptr || ft.Elem().Kind() != reflect.Slice {
  415. break
  416. }
  417. ft := ft.Elem().Elem()
  418. switch fd.Kind() {
  419. case pref.BoolKind:
  420. if ft.Kind() == reflect.Bool {
  421. return coderBoolSliceIface
  422. }
  423. case pref.EnumKind:
  424. if ft.Kind() == reflect.Int32 {
  425. return coderEnumSliceIface
  426. }
  427. case pref.Int32Kind:
  428. if ft.Kind() == reflect.Int32 {
  429. return coderInt32SliceIface
  430. }
  431. case pref.Sint32Kind:
  432. if ft.Kind() == reflect.Int32 {
  433. return coderSint32SliceIface
  434. }
  435. case pref.Uint32Kind:
  436. if ft.Kind() == reflect.Uint32 {
  437. return coderUint32SliceIface
  438. }
  439. case pref.Int64Kind:
  440. if ft.Kind() == reflect.Int64 {
  441. return coderInt64SliceIface
  442. }
  443. case pref.Sint64Kind:
  444. if ft.Kind() == reflect.Int64 {
  445. return coderSint64SliceIface
  446. }
  447. case pref.Uint64Kind:
  448. if ft.Kind() == reflect.Uint64 {
  449. return coderUint64SliceIface
  450. }
  451. case pref.Sfixed32Kind:
  452. if ft.Kind() == reflect.Int32 {
  453. return coderSfixed32SliceIface
  454. }
  455. case pref.Fixed32Kind:
  456. if ft.Kind() == reflect.Uint32 {
  457. return coderFixed32SliceIface
  458. }
  459. case pref.FloatKind:
  460. if ft.Kind() == reflect.Float32 {
  461. return coderFloatSliceIface
  462. }
  463. case pref.Sfixed64Kind:
  464. if ft.Kind() == reflect.Int64 {
  465. return coderSfixed64SliceIface
  466. }
  467. case pref.Fixed64Kind:
  468. if ft.Kind() == reflect.Uint64 {
  469. return coderFixed64SliceIface
  470. }
  471. case pref.DoubleKind:
  472. if ft.Kind() == reflect.Float64 {
  473. return coderDoubleSliceIface
  474. }
  475. case pref.StringKind:
  476. if ft.Kind() == reflect.String {
  477. return coderStringSliceIface
  478. }
  479. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  480. return coderBytesSliceIface
  481. }
  482. case pref.BytesKind:
  483. if ft.Kind() == reflect.String {
  484. return coderStringSliceIface
  485. }
  486. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  487. return coderBytesSliceIface
  488. }
  489. case pref.MessageKind:
  490. return coderMessageSliceIface
  491. case pref.GroupKind:
  492. return coderGroupSliceIface
  493. }
  494. case fd.Cardinality() == pref.Repeated && fd.IsPacked():
  495. if ft.Kind() != reflect.Ptr || ft.Elem().Kind() != reflect.Slice {
  496. break
  497. }
  498. ft := ft.Elem().Elem()
  499. switch fd.Kind() {
  500. case pref.BoolKind:
  501. if ft.Kind() == reflect.Bool {
  502. return coderBoolPackedSliceIface
  503. }
  504. case pref.EnumKind:
  505. if ft.Kind() == reflect.Int32 {
  506. return coderEnumPackedSliceIface
  507. }
  508. case pref.Int32Kind:
  509. if ft.Kind() == reflect.Int32 {
  510. return coderInt32PackedSliceIface
  511. }
  512. case pref.Sint32Kind:
  513. if ft.Kind() == reflect.Int32 {
  514. return coderSint32PackedSliceIface
  515. }
  516. case pref.Uint32Kind:
  517. if ft.Kind() == reflect.Uint32 {
  518. return coderUint32PackedSliceIface
  519. }
  520. case pref.Int64Kind:
  521. if ft.Kind() == reflect.Int64 {
  522. return coderInt64PackedSliceIface
  523. }
  524. case pref.Sint64Kind:
  525. if ft.Kind() == reflect.Int64 {
  526. return coderSint64PackedSliceIface
  527. }
  528. case pref.Uint64Kind:
  529. if ft.Kind() == reflect.Uint64 {
  530. return coderUint64PackedSliceIface
  531. }
  532. case pref.Sfixed32Kind:
  533. if ft.Kind() == reflect.Int32 {
  534. return coderSfixed32PackedSliceIface
  535. }
  536. case pref.Fixed32Kind:
  537. if ft.Kind() == reflect.Uint32 {
  538. return coderFixed32PackedSliceIface
  539. }
  540. case pref.FloatKind:
  541. if ft.Kind() == reflect.Float32 {
  542. return coderFloatPackedSliceIface
  543. }
  544. case pref.Sfixed64Kind:
  545. if ft.Kind() == reflect.Int64 {
  546. return coderSfixed64PackedSliceIface
  547. }
  548. case pref.Fixed64Kind:
  549. if ft.Kind() == reflect.Uint64 {
  550. return coderFixed64PackedSliceIface
  551. }
  552. case pref.DoubleKind:
  553. if ft.Kind() == reflect.Float64 {
  554. return coderDoublePackedSliceIface
  555. }
  556. }
  557. default:
  558. switch fd.Kind() {
  559. case pref.BoolKind:
  560. if ft.Kind() == reflect.Bool {
  561. return coderBoolIface
  562. }
  563. case pref.EnumKind:
  564. if ft.Kind() == reflect.Int32 {
  565. return coderEnumIface
  566. }
  567. case pref.Int32Kind:
  568. if ft.Kind() == reflect.Int32 {
  569. return coderInt32Iface
  570. }
  571. case pref.Sint32Kind:
  572. if ft.Kind() == reflect.Int32 {
  573. return coderSint32Iface
  574. }
  575. case pref.Uint32Kind:
  576. if ft.Kind() == reflect.Uint32 {
  577. return coderUint32Iface
  578. }
  579. case pref.Int64Kind:
  580. if ft.Kind() == reflect.Int64 {
  581. return coderInt64Iface
  582. }
  583. case pref.Sint64Kind:
  584. if ft.Kind() == reflect.Int64 {
  585. return coderSint64Iface
  586. }
  587. case pref.Uint64Kind:
  588. if ft.Kind() == reflect.Uint64 {
  589. return coderUint64Iface
  590. }
  591. case pref.Sfixed32Kind:
  592. if ft.Kind() == reflect.Int32 {
  593. return coderSfixed32Iface
  594. }
  595. case pref.Fixed32Kind:
  596. if ft.Kind() == reflect.Uint32 {
  597. return coderFixed32Iface
  598. }
  599. case pref.FloatKind:
  600. if ft.Kind() == reflect.Float32 {
  601. return coderFloatIface
  602. }
  603. case pref.Sfixed64Kind:
  604. if ft.Kind() == reflect.Int64 {
  605. return coderSfixed64Iface
  606. }
  607. case pref.Fixed64Kind:
  608. if ft.Kind() == reflect.Uint64 {
  609. return coderFixed64Iface
  610. }
  611. case pref.DoubleKind:
  612. if ft.Kind() == reflect.Float64 {
  613. return coderDoubleIface
  614. }
  615. case pref.StringKind:
  616. if fd.Syntax() == pref.Proto3 && ft.Kind() == reflect.String {
  617. return coderStringIfaceValidateUTF8
  618. }
  619. if ft.Kind() == reflect.String {
  620. return coderStringIface
  621. }
  622. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  623. return coderBytesIface
  624. }
  625. case pref.BytesKind:
  626. if ft.Kind() == reflect.String {
  627. return coderStringIface
  628. }
  629. if ft.Kind() == reflect.Slice && ft.Elem().Kind() == reflect.Uint8 {
  630. return coderBytesIface
  631. }
  632. case pref.MessageKind:
  633. return coderMessageIface
  634. case pref.GroupKind:
  635. return makeGroupValueCoder(fd, ft)
  636. }
  637. }
  638. panic(fmt.Errorf("invalid type: no encoder for %v %v %v/%v", fd.FullName(), fd.Cardinality(), fd.Kind(), ft))
  639. }