You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

714 lines
17 KiB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
  1. package binary
  2. import (
  3. "encoding/hex"
  4. "encoding/json"
  5. "errors"
  6. "io"
  7. "reflect"
  8. "sync"
  9. "time"
  10. . "github.com/tendermint/tendermint2/common"
  11. )
  12. type TypeInfo struct {
  13. Type reflect.Type // The type
  14. // Custom encoder/decoder
  15. // NOTE: Not used.
  16. BinaryEncoder Encoder
  17. BinaryDecoder Decoder
  18. // If Type is kind reflect.Interface
  19. ConcreteTypes map[byte]reflect.Type
  20. // If Type is concrete
  21. HasTypeByte bool
  22. TypeByte byte
  23. // If Type is kind reflect.Struct
  24. Fields []StructFieldInfo
  25. }
  26. type StructFieldInfo struct {
  27. Index int // Struct field index
  28. JSONName string // Corresponding JSON field name. (override with `json=""`)
  29. Type reflect.Type // Struct field type
  30. }
  31. func (info StructFieldInfo) unpack() (int, string, reflect.Type) {
  32. return info.Index, info.JSONName, info.Type
  33. }
  34. // e.g. If o is struct{Foo}{}, return is the Foo interface type.
  35. func GetTypeFromStructDeclaration(o interface{}) reflect.Type {
  36. rt := reflect.TypeOf(o)
  37. if rt.NumField() != 1 {
  38. panic("Unexpected number of fields in struct-wrapped declaration of type")
  39. }
  40. return rt.Field(0).Type
  41. }
  42. // If o implements HasTypeByte, returns (true, typeByte)
  43. func GetTypeByteFromStruct(o interface{}) (hasTypeByte bool, typeByte byte) {
  44. if _, ok := o.(HasTypeByte); ok {
  45. return true, o.(HasTypeByte).TypeByte()
  46. } else {
  47. return false, byte(0x00)
  48. }
  49. }
  50. // Predeclaration of common types
  51. var (
  52. timeType = GetTypeFromStructDeclaration(struct{ time.Time }{})
  53. )
  54. const (
  55. rfc2822 = "Mon Jan 02 15:04:05 -0700 2006"
  56. )
  57. // If a type implements TypeByte, the byte is included
  58. // as the first byte for encoding and decoding.
  59. // This is primarily used to encode interfaces types.
  60. // The interface should be declared with RegisterInterface()
  61. type HasTypeByte interface {
  62. TypeByte() byte
  63. }
  64. // NOTE: do not access typeInfos directly, but call GetTypeInfo()
  65. var typeInfosMtx sync.Mutex
  66. var typeInfos = map[reflect.Type]*TypeInfo{}
  67. func GetTypeInfo(rt reflect.Type) *TypeInfo {
  68. typeInfosMtx.Lock()
  69. defer typeInfosMtx.Unlock()
  70. info := typeInfos[rt]
  71. if info == nil {
  72. info = &TypeInfo{Type: rt}
  73. RegisterType(info)
  74. }
  75. return info
  76. }
  77. // For use with the RegisterInterface declaration
  78. type ConcreteType struct {
  79. O interface{}
  80. }
  81. // Must use this to register an interface to properly decode the
  82. // underlying concrete type.
  83. func RegisterInterface(o interface{}, args ...interface{}) *TypeInfo {
  84. it := GetTypeFromStructDeclaration(o)
  85. if it.Kind() != reflect.Interface {
  86. panic("RegisterInterface expects an interface")
  87. }
  88. concreteTypes := make(map[byte]reflect.Type, 0)
  89. for _, arg := range args {
  90. switch arg.(type) {
  91. case ConcreteType:
  92. concreteTypeInfo := arg.(ConcreteType)
  93. concreteType := reflect.TypeOf(concreteTypeInfo.O)
  94. hasTypeByte, typeByte := GetTypeByteFromStruct(concreteTypeInfo.O)
  95. //fmt.Println(Fmt("HasTypeByte: %v typeByte: %X type: %X", hasTypeByte, typeByte, concreteType))
  96. if !hasTypeByte {
  97. panic(Fmt("Expected concrete type %v to implement HasTypeByte", concreteType))
  98. }
  99. if concreteTypes[typeByte] != nil {
  100. panic(Fmt("Duplicate TypeByte for type %v and %v", concreteType, concreteTypes[typeByte]))
  101. }
  102. concreteTypes[typeByte] = concreteType
  103. default:
  104. panic(Fmt("Unexpected argument type %v", reflect.TypeOf(arg)))
  105. }
  106. }
  107. typeInfo := &TypeInfo{
  108. Type: it,
  109. ConcreteTypes: concreteTypes,
  110. }
  111. typeInfos[it] = typeInfo
  112. return typeInfo
  113. }
  114. // Registers and possibly modifies the TypeInfo.
  115. // NOTE: not goroutine safe, so only call upon program init.
  116. func RegisterType(info *TypeInfo) *TypeInfo {
  117. // Also register the dereferenced struct if info.Type is a pointer.
  118. // Or, if info.Type is not a pointer, register the pointer.
  119. var rt, ptrRt reflect.Type
  120. if info.Type.Kind() == reflect.Ptr {
  121. rt, ptrRt = info.Type.Elem(), info.Type
  122. } else {
  123. rt, ptrRt = info.Type, reflect.PtrTo(info.Type)
  124. }
  125. // Register the type info
  126. typeInfos[rt] = info
  127. typeInfos[ptrRt] = info
  128. // See if the type implements HasTypeByte
  129. if rt.Kind() != reflect.Interface && rt.Implements(reflect.TypeOf((*HasTypeByte)(nil)).Elem()) {
  130. zero := reflect.Zero(rt)
  131. typeByte := zero.Interface().(HasTypeByte).TypeByte()
  132. if info.HasTypeByte && info.TypeByte != typeByte {
  133. panic(Fmt("Type %v expected TypeByte of %X", rt, typeByte))
  134. } else {
  135. info.HasTypeByte = true
  136. info.TypeByte = typeByte
  137. }
  138. } else if ptrRt.Implements(reflect.TypeOf((*HasTypeByte)(nil)).Elem()) {
  139. zero := reflect.Zero(ptrRt)
  140. typeByte := zero.Interface().(HasTypeByte).TypeByte()
  141. if info.HasTypeByte && info.TypeByte != typeByte {
  142. panic(Fmt("Type %v expected TypeByte of %X", ptrRt, typeByte))
  143. } else {
  144. info.HasTypeByte = true
  145. info.TypeByte = typeByte
  146. }
  147. }
  148. // If struct, register field name options
  149. if rt.Kind() == reflect.Struct {
  150. numFields := rt.NumField()
  151. structFields := []StructFieldInfo{}
  152. for i := 0; i < numFields; i++ {
  153. field := rt.Field(i)
  154. if field.PkgPath != "" {
  155. continue
  156. }
  157. jsonName := field.Tag.Get("json")
  158. if jsonName == "" {
  159. jsonName = field.Name
  160. }
  161. structFields = append(structFields, StructFieldInfo{
  162. Index: i,
  163. JSONName: jsonName,
  164. Type: field.Type,
  165. })
  166. }
  167. info.Fields = structFields
  168. }
  169. return info
  170. }
  171. func readReflect(rv reflect.Value, rt reflect.Type, r io.Reader, n *int64, err *error) {
  172. log.Debug("Read reflect", "type", rt)
  173. // Get typeInfo
  174. typeInfo := GetTypeInfo(rt)
  175. // Custom decoder
  176. if typeInfo.BinaryDecoder != nil {
  177. decoded := typeInfo.BinaryDecoder(r, n, err)
  178. rv.Set(reflect.ValueOf(decoded))
  179. return
  180. }
  181. // Create a new struct if rv is nil pointer.
  182. if rt.Kind() == reflect.Ptr && rv.IsNil() {
  183. newRv := reflect.New(rt.Elem())
  184. rv.Set(newRv)
  185. rv = newRv
  186. }
  187. // Dereference pointer
  188. // Still addressable, thus settable!
  189. if rv.Kind() == reflect.Ptr {
  190. rv, rt = rv.Elem(), rt.Elem()
  191. }
  192. // Read TypeByte prefix
  193. if typeInfo.HasTypeByte {
  194. typeByte := ReadByte(r, n, err)
  195. log.Debug("Read typebyte", "typeByte", typeByte)
  196. if typeByte != typeInfo.TypeByte {
  197. *err = errors.New(Fmt("Expected TypeByte of %X but got %X", typeInfo.TypeByte, typeByte))
  198. return
  199. }
  200. }
  201. switch rt.Kind() {
  202. case reflect.Interface:
  203. typeByte := ReadByte(r, n, err)
  204. if *err != nil {
  205. return
  206. }
  207. concreteType, ok := typeInfo.ConcreteTypes[typeByte]
  208. if !ok {
  209. panic(Fmt("TypeByte %X not registered for interface %v", typeByte, rt))
  210. }
  211. newRv := reflect.New(concreteType)
  212. readReflect(newRv.Elem(), concreteType, NewPrefixedReader([]byte{typeByte}, r), n, err)
  213. rv.Set(newRv.Elem())
  214. case reflect.Slice:
  215. elemRt := rt.Elem()
  216. if elemRt.Kind() == reflect.Uint8 {
  217. // Special case: Byteslices
  218. byteslice := ReadByteSlice(r, n, err)
  219. log.Debug("Read byteslice", "bytes", byteslice)
  220. rv.Set(reflect.ValueOf(byteslice))
  221. } else {
  222. // Read length
  223. length := int(ReadUvarint(r, n, err))
  224. log.Debug(Fmt("Read length: %v", length))
  225. sliceRv := reflect.MakeSlice(rt, length, length)
  226. // Read elems
  227. for i := 0; i < length; i++ {
  228. elemRv := sliceRv.Index(i)
  229. readReflect(elemRv, elemRt, r, n, err)
  230. }
  231. rv.Set(sliceRv)
  232. }
  233. case reflect.Struct:
  234. if rt == timeType {
  235. // Special case: time.Time
  236. t := ReadTime(r, n, err)
  237. log.Debug(Fmt("Read time: %v", t))
  238. rv.Set(reflect.ValueOf(t))
  239. } else {
  240. numFields := rt.NumField()
  241. for i := 0; i < numFields; i++ {
  242. field := rt.Field(i)
  243. if field.PkgPath != "" {
  244. continue
  245. }
  246. fieldRv := rv.Field(i)
  247. readReflect(fieldRv, field.Type, r, n, err)
  248. }
  249. }
  250. case reflect.String:
  251. str := ReadString(r, n, err)
  252. log.Debug(Fmt("Read string: %v", str))
  253. rv.SetString(str)
  254. case reflect.Int64:
  255. num := ReadUint64(r, n, err)
  256. log.Debug(Fmt("Read num: %v", num))
  257. rv.SetInt(int64(num))
  258. case reflect.Int32:
  259. num := ReadUint32(r, n, err)
  260. log.Debug(Fmt("Read num: %v", num))
  261. rv.SetInt(int64(num))
  262. case reflect.Int16:
  263. num := ReadUint16(r, n, err)
  264. log.Debug(Fmt("Read num: %v", num))
  265. rv.SetInt(int64(num))
  266. case reflect.Int8:
  267. num := ReadUint8(r, n, err)
  268. log.Debug(Fmt("Read num: %v", num))
  269. rv.SetInt(int64(num))
  270. case reflect.Int:
  271. num := ReadUvarint(r, n, err)
  272. log.Debug(Fmt("Read num: %v", num))
  273. rv.SetInt(int64(num))
  274. case reflect.Uint64:
  275. num := ReadUint64(r, n, err)
  276. log.Debug(Fmt("Read num: %v", num))
  277. rv.SetUint(uint64(num))
  278. case reflect.Uint32:
  279. num := ReadUint32(r, n, err)
  280. log.Debug(Fmt("Read num: %v", num))
  281. rv.SetUint(uint64(num))
  282. case reflect.Uint16:
  283. num := ReadUint16(r, n, err)
  284. log.Debug(Fmt("Read num: %v", num))
  285. rv.SetUint(uint64(num))
  286. case reflect.Uint8:
  287. num := ReadUint8(r, n, err)
  288. log.Debug(Fmt("Read num: %v", num))
  289. rv.SetUint(uint64(num))
  290. case reflect.Uint:
  291. num := ReadUvarint(r, n, err)
  292. log.Debug(Fmt("Read num: %v", num))
  293. rv.SetUint(uint64(num))
  294. default:
  295. panic(Fmt("Unknown field type %v", rt.Kind()))
  296. }
  297. }
  298. func writeReflect(rv reflect.Value, rt reflect.Type, w io.Writer, n *int64, err *error) {
  299. // Get typeInfo
  300. typeInfo := GetTypeInfo(rt)
  301. // Custom encoder, say for an interface type rt.
  302. if typeInfo.BinaryEncoder != nil {
  303. typeInfo.BinaryEncoder(rv.Interface(), w, n, err)
  304. return
  305. }
  306. // Dereference interface
  307. if rt.Kind() == reflect.Interface {
  308. rv = rv.Elem()
  309. rt = rv.Type()
  310. // If interface type, get typeInfo of underlying type.
  311. typeInfo = GetTypeInfo(rt)
  312. }
  313. // Dereference pointer
  314. if rt.Kind() == reflect.Ptr {
  315. rt = rt.Elem()
  316. rv = rv.Elem()
  317. }
  318. // Write TypeByte prefix
  319. if typeInfo.HasTypeByte {
  320. WriteByte(typeInfo.TypeByte, w, n, err)
  321. }
  322. switch rt.Kind() {
  323. case reflect.Slice:
  324. elemRt := rt.Elem()
  325. if elemRt.Kind() == reflect.Uint8 {
  326. // Special case: Byteslices
  327. byteslice := rv.Bytes()
  328. WriteByteSlice(byteslice, w, n, err)
  329. } else {
  330. // Write length
  331. length := rv.Len()
  332. WriteUvarint(uint(length), w, n, err)
  333. // Write elems
  334. for i := 0; i < length; i++ {
  335. elemRv := rv.Index(i)
  336. writeReflect(elemRv, elemRt, w, n, err)
  337. }
  338. }
  339. case reflect.Struct:
  340. if rt == timeType {
  341. // Special case: time.Time
  342. WriteTime(rv.Interface().(time.Time), w, n, err)
  343. } else {
  344. numFields := rt.NumField()
  345. for i := 0; i < numFields; i++ {
  346. field := rt.Field(i)
  347. if field.PkgPath != "" {
  348. continue
  349. }
  350. fieldRv := rv.Field(i)
  351. writeReflect(fieldRv, field.Type, w, n, err)
  352. }
  353. }
  354. case reflect.String:
  355. WriteString(rv.String(), w, n, err)
  356. case reflect.Int64:
  357. WriteInt64(rv.Int(), w, n, err)
  358. case reflect.Int32:
  359. WriteInt32(int32(rv.Int()), w, n, err)
  360. case reflect.Int16:
  361. WriteInt16(int16(rv.Int()), w, n, err)
  362. case reflect.Int8:
  363. WriteInt8(int8(rv.Int()), w, n, err)
  364. case reflect.Int:
  365. WriteVarint(int(rv.Int()), w, n, err)
  366. case reflect.Uint64:
  367. WriteUint64(rv.Uint(), w, n, err)
  368. case reflect.Uint32:
  369. WriteUint32(uint32(rv.Uint()), w, n, err)
  370. case reflect.Uint16:
  371. WriteUint16(uint16(rv.Uint()), w, n, err)
  372. case reflect.Uint8:
  373. WriteUint8(uint8(rv.Uint()), w, n, err)
  374. case reflect.Uint:
  375. WriteUvarint(uint(rv.Uint()), w, n, err)
  376. default:
  377. panic(Fmt("Unknown field type %v", rt.Kind()))
  378. }
  379. }
  380. //-----------------------------------------------------------------------------
  381. func readTypeByteJSON(o interface{}) (typeByte byte, rest interface{}, err error) {
  382. oSlice, ok := o.([]interface{})
  383. if !ok {
  384. err = errors.New(Fmt("Expected type [TypeByte,?] but got type %v", reflect.TypeOf(o)))
  385. return
  386. }
  387. if len(oSlice) != 2 {
  388. err = errors.New(Fmt("Expected [TypeByte,?] len 2 but got len %v", len(oSlice)))
  389. return
  390. }
  391. typeByte_, ok := oSlice[0].(float64)
  392. typeByte = byte(typeByte_)
  393. rest = oSlice[1]
  394. return
  395. }
  396. func readReflectJSON(rv reflect.Value, rt reflect.Type, o interface{}, err *error) {
  397. log.Debug("Read reflect json", "type", rt)
  398. // Get typeInfo
  399. typeInfo := GetTypeInfo(rt)
  400. // Create a new struct if rv is nil pointer.
  401. if rt.Kind() == reflect.Ptr && rv.IsNil() {
  402. newRv := reflect.New(rt.Elem())
  403. rv.Set(newRv)
  404. rv = newRv
  405. }
  406. // Dereference pointer
  407. // Still addressable, thus settable!
  408. if rv.Kind() == reflect.Ptr {
  409. rv, rt = rv.Elem(), rt.Elem()
  410. }
  411. // Read TypeByte prefix
  412. if typeInfo.HasTypeByte {
  413. typeByte, rest, err_ := readTypeByteJSON(o)
  414. if err_ != nil {
  415. *err = err_
  416. return
  417. }
  418. if typeByte != typeInfo.TypeByte {
  419. *err = errors.New(Fmt("Expected TypeByte of %X but got %X", typeInfo.TypeByte, byte(typeByte)))
  420. return
  421. }
  422. o = rest
  423. }
  424. switch rt.Kind() {
  425. case reflect.Interface:
  426. typeByte, _, err_ := readTypeByteJSON(o)
  427. if err_ != nil {
  428. *err = err_
  429. return
  430. }
  431. concreteType, ok := typeInfo.ConcreteTypes[typeByte]
  432. if !ok {
  433. panic(Fmt("TypeByte %X not registered for interface %v", typeByte, rt))
  434. }
  435. newRv := reflect.New(concreteType)
  436. readReflectJSON(newRv.Elem(), concreteType, o, err)
  437. rv.Set(newRv.Elem())
  438. case reflect.Slice:
  439. elemRt := rt.Elem()
  440. if elemRt.Kind() == reflect.Uint8 {
  441. // Special case: Byteslices
  442. oString, ok := o.(string)
  443. if !ok {
  444. *err = errors.New(Fmt("Expected string but got type %v", reflect.TypeOf(o)))
  445. return
  446. }
  447. byteslice, err_ := hex.DecodeString(oString)
  448. if err_ != nil {
  449. *err = err_
  450. return
  451. }
  452. log.Debug("Read byteslice", "bytes", byteslice)
  453. rv.Set(reflect.ValueOf(byteslice))
  454. } else {
  455. // Read length
  456. oSlice, ok := o.([]interface{})
  457. if !ok {
  458. *err = errors.New(Fmt("Expected array but got type %v", reflect.TypeOf(o)))
  459. return
  460. }
  461. length := len(oSlice)
  462. log.Debug(Fmt("Read length: %v", length))
  463. sliceRv := reflect.MakeSlice(rt, length, length)
  464. // Read elems
  465. for i := 0; i < length; i++ {
  466. elemRv := sliceRv.Index(i)
  467. readReflectJSON(elemRv, elemRt, oSlice[i], err)
  468. }
  469. rv.Set(sliceRv)
  470. }
  471. case reflect.Struct:
  472. if rt == timeType {
  473. // Special case: time.Time
  474. str, ok := o.(string)
  475. if !ok {
  476. *err = errors.New(Fmt("Expected string but got type %v", reflect.TypeOf(o)))
  477. return
  478. }
  479. log.Debug(Fmt("Read time: %v", str))
  480. t, err_ := time.Parse(rfc2822, str)
  481. if err_ != nil {
  482. *err = err_
  483. return
  484. }
  485. rv.Set(reflect.ValueOf(t))
  486. } else {
  487. oMap, ok := o.(map[string]interface{})
  488. if !ok {
  489. *err = errors.New(Fmt("Expected map but got type %v", reflect.TypeOf(o)))
  490. return
  491. }
  492. // TODO: ensure that all fields are set?
  493. // TODO: disallow unknown oMap fields?
  494. for _, fieldInfo := range typeInfo.Fields {
  495. i, jsonName, fieldType := fieldInfo.unpack()
  496. value, ok := oMap[jsonName]
  497. if !ok {
  498. continue // Skip missing fields.
  499. }
  500. fieldRv := rv.Field(i)
  501. readReflectJSON(fieldRv, fieldType, value, err)
  502. }
  503. }
  504. case reflect.String:
  505. str, ok := o.(string)
  506. if !ok {
  507. *err = errors.New(Fmt("Expected string but got type %v", reflect.TypeOf(o)))
  508. return
  509. }
  510. log.Debug(Fmt("Read string: %v", str))
  511. rv.SetString(str)
  512. case reflect.Int64, reflect.Int32, reflect.Int16, reflect.Int8, reflect.Int:
  513. num, ok := o.(float64)
  514. if !ok {
  515. *err = errors.New(Fmt("Expected numeric but got type %v", reflect.TypeOf(o)))
  516. return
  517. }
  518. log.Debug(Fmt("Read num: %v", num))
  519. rv.SetInt(int64(num))
  520. case reflect.Uint64, reflect.Uint32, reflect.Uint16, reflect.Uint8, reflect.Uint:
  521. num, ok := o.(float64)
  522. if !ok {
  523. *err = errors.New(Fmt("Expected numeric but got type %v", reflect.TypeOf(o)))
  524. return
  525. }
  526. if num < 0 {
  527. *err = errors.New(Fmt("Expected unsigned numeric but got %v", num))
  528. return
  529. }
  530. log.Debug(Fmt("Read num: %v", num))
  531. rv.SetUint(uint64(num))
  532. default:
  533. panic(Fmt("Unknown field type %v", rt.Kind()))
  534. }
  535. }
  536. func writeReflectJSON(rv reflect.Value, rt reflect.Type, w io.Writer, n *int64, err *error) {
  537. // Get typeInfo
  538. typeInfo := GetTypeInfo(rt)
  539. // Dereference interface
  540. if rt.Kind() == reflect.Interface {
  541. rv = rv.Elem()
  542. rt = rv.Type()
  543. // If interface type, get typeInfo of underlying type.
  544. typeInfo = GetTypeInfo(rt)
  545. }
  546. // Dereference pointer
  547. if rt.Kind() == reflect.Ptr {
  548. rt = rt.Elem()
  549. rv = rv.Elem()
  550. }
  551. // Write TypeByte prefix
  552. if typeInfo.HasTypeByte {
  553. WriteTo([]byte(Fmt("[%v,", typeInfo.TypeByte)), w, n, err)
  554. }
  555. switch rt.Kind() {
  556. case reflect.Slice:
  557. elemRt := rt.Elem()
  558. if elemRt.Kind() == reflect.Uint8 {
  559. // Special case: Byteslices
  560. byteslice := rv.Bytes()
  561. WriteTo([]byte(Fmt("\"%X\"", byteslice)), w, n, err)
  562. //WriteByteSlice(byteslice, w, n, err)
  563. } else {
  564. WriteTo([]byte("["), w, n, err)
  565. // Write elems
  566. length := rv.Len()
  567. for i := 0; i < length; i++ {
  568. elemRv := rv.Index(i)
  569. writeReflectJSON(elemRv, elemRt, w, n, err)
  570. if i < length-1 {
  571. WriteTo([]byte(","), w, n, err)
  572. }
  573. }
  574. WriteTo([]byte("]"), w, n, err)
  575. }
  576. case reflect.Struct:
  577. if rt == timeType {
  578. // Special case: time.Time
  579. t := rv.Interface().(time.Time)
  580. str := t.Format(rfc2822)
  581. jsonBytes, err_ := json.Marshal(str)
  582. if err_ != nil {
  583. *err = err_
  584. return
  585. }
  586. WriteTo(jsonBytes, w, n, err)
  587. } else {
  588. WriteTo([]byte("{"), w, n, err)
  589. wroteField := false
  590. for _, fieldInfo := range typeInfo.Fields {
  591. i, jsonName, fieldType := fieldInfo.unpack()
  592. fieldRv := rv.Field(i)
  593. if wroteField {
  594. WriteTo([]byte(","), w, n, err)
  595. } else {
  596. wroteField = true
  597. }
  598. WriteTo([]byte(Fmt("\"%v\":", jsonName)), w, n, err)
  599. writeReflectJSON(fieldRv, fieldType, w, n, err)
  600. }
  601. WriteTo([]byte("}"), w, n, err)
  602. }
  603. case reflect.String:
  604. fallthrough
  605. case reflect.Uint64, reflect.Uint32, reflect.Uint16, reflect.Uint8, reflect.Uint:
  606. fallthrough
  607. case reflect.Int64, reflect.Int32, reflect.Int16, reflect.Int8, reflect.Int:
  608. jsonBytes, err_ := json.Marshal(rv.Interface())
  609. if err_ != nil {
  610. *err = err_
  611. return
  612. }
  613. WriteTo(jsonBytes, w, n, err)
  614. default:
  615. panic(Fmt("Unknown field type %v", rt.Kind()))
  616. }
  617. // Write TypeByte close bracket
  618. if typeInfo.HasTypeByte {
  619. WriteTo([]byte("]"), w, n, err)
  620. }
  621. }
  622. //-----------------------------------------------------------------------------