codec_tables.go 17 KB

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