feature_reflect_extension.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package jsoniter
  2. import (
  3. "reflect"
  4. "fmt"
  5. "unsafe"
  6. )
  7. var typeDecoders map[string]ValDecoder
  8. var fieldDecoders map[string]ValDecoder
  9. var typeEncoders map[string]ValEncoder
  10. var fieldEncoders map[string]ValEncoder
  11. var extensions []ExtensionFunc
  12. type ExtensionFunc func(typ reflect.Type, field *reflect.StructField) ([]string, EncoderFunc, DecoderFunc)
  13. type funcDecoder struct {
  14. fun DecoderFunc
  15. }
  16. func init() {
  17. typeDecoders = map[string]ValDecoder{}
  18. fieldDecoders = map[string]ValDecoder{}
  19. typeEncoders = map[string]ValEncoder{}
  20. fieldEncoders = map[string]ValEncoder{}
  21. extensions = []ExtensionFunc{}
  22. }
  23. func RegisterTypeDecoderFunc(typ string, fun DecoderFunc) {
  24. typeDecoders[typ] = &funcDecoder{fun}
  25. }
  26. func RegisterTypeDecoder(typ string, decoder ValDecoder) {
  27. typeDecoders[typ] = decoder
  28. }
  29. func RegisterFieldDecoderFunc(typ string, field string, fun DecoderFunc) {
  30. RegisterFieldDecoder(typ, field, &funcDecoder{fun})
  31. }
  32. func RegisterFieldDecoder(typ string, field string, decoder ValDecoder) {
  33. fieldDecoders[fmt.Sprintf("%s/%s", typ, field)] = decoder
  34. }
  35. func RegisterTypeEncoderFunc(typ string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) {
  36. typeEncoders[typ] = &funcEncoder{fun, isEmptyFunc}
  37. }
  38. func RegisterTypeEncoder(typ string, encoder ValEncoder) {
  39. typeEncoders[typ] = encoder
  40. }
  41. func RegisterFieldEncoderFunc(typ string, field string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) {
  42. RegisterFieldEncoder(typ, field, &funcEncoder{fun, isEmptyFunc})
  43. }
  44. func RegisterFieldEncoder(typ string, field string, encoder ValEncoder) {
  45. fieldEncoders[fmt.Sprintf("%s/%s", typ, field)] = encoder
  46. }
  47. func RegisterExtension(extension ExtensionFunc) {
  48. extensions = append(extensions, extension)
  49. }
  50. func getTypeDecoderFromExtension(typ reflect.Type) ValDecoder {
  51. typeName := typ.String()
  52. typeDecoder := typeDecoders[typeName]
  53. if typeDecoder != nil {
  54. return typeDecoder
  55. }
  56. if typ.Kind() == reflect.Ptr {
  57. typeDecoder := typeDecoders[typ.Elem().String()]
  58. if typeDecoder != nil {
  59. return &optionalDecoder{typ.Elem(), typeDecoder}
  60. }
  61. }
  62. return nil
  63. }
  64. func getTypeEncoderFromExtension(typ reflect.Type) ValEncoder {
  65. typeName := typ.String()
  66. typeEncoder := typeEncoders[typeName]
  67. if typeEncoder != nil {
  68. return typeEncoder
  69. }
  70. if typ.Kind() == reflect.Ptr {
  71. typeEncoder := typeEncoders[typ.Elem().String()]
  72. if typeEncoder != nil {
  73. return &optionalEncoder{typeEncoder}
  74. }
  75. }
  76. return nil
  77. }