Pārlūkot izejas kodu

#66 extract out feacture_reflect_extension

Tao Wen 8 gadi atpakaļ
vecāks
revīzija
499412ec4c
1 mainītis faili ar 93 papildinājumiem un 0 dzēšanām
  1. 93 0
      feature_reflect_extension.go

+ 93 - 0
feature_reflect_extension.go

@@ -0,0 +1,93 @@
+package jsoniter
+
+import (
+	"reflect"
+	"fmt"
+	"unsafe"
+)
+
+var typeDecoders map[string]ValDecoder
+var fieldDecoders map[string]ValDecoder
+var typeEncoders map[string]ValEncoder
+var fieldEncoders map[string]ValEncoder
+var extensions []ExtensionFunc
+
+type ExtensionFunc func(typ reflect.Type, field *reflect.StructField) ([]string, EncoderFunc, DecoderFunc)
+
+type funcDecoder struct {
+	fun DecoderFunc
+}
+
+func init() {
+	typeDecoders = map[string]ValDecoder{}
+	fieldDecoders = map[string]ValDecoder{}
+	typeEncoders = map[string]ValEncoder{}
+	fieldEncoders = map[string]ValEncoder{}
+	extensions = []ExtensionFunc{}
+}
+
+func RegisterTypeDecoderFunc(typ string, fun DecoderFunc) {
+	typeDecoders[typ] = &funcDecoder{fun}
+}
+
+func RegisterTypeDecoder(typ string, decoder ValDecoder) {
+	typeDecoders[typ] = decoder
+}
+
+func RegisterFieldDecoderFunc(typ string, field string, fun DecoderFunc) {
+	RegisterFieldDecoder(typ, field, &funcDecoder{fun})
+}
+
+func RegisterFieldDecoder(typ string, field string, decoder ValDecoder) {
+	fieldDecoders[fmt.Sprintf("%s/%s", typ, field)] = decoder
+}
+
+func RegisterTypeEncoderFunc(typ string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) {
+	typeEncoders[typ] = &funcEncoder{fun, isEmptyFunc}
+}
+
+func RegisterTypeEncoder(typ string, encoder ValEncoder) {
+	typeEncoders[typ] = encoder
+}
+
+func RegisterFieldEncoderFunc(typ string, field string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) {
+	RegisterFieldEncoder(typ, field, &funcEncoder{fun, isEmptyFunc})
+}
+
+func RegisterFieldEncoder(typ string, field string, encoder ValEncoder) {
+	fieldEncoders[fmt.Sprintf("%s/%s", typ, field)] = encoder
+}
+
+func RegisterExtension(extension ExtensionFunc) {
+	extensions = append(extensions, extension)
+}
+
+func getTypeDecoderFromExtension(typ reflect.Type) ValDecoder {
+	typeName := typ.String()
+	typeDecoder := typeDecoders[typeName]
+	if typeDecoder != nil {
+		return typeDecoder
+	}
+	if typ.Kind() == reflect.Ptr {
+		typeDecoder := typeDecoders[typ.Elem().String()]
+		if typeDecoder != nil {
+			return &optionalDecoder{typ.Elem(), typeDecoder}
+		}
+	}
+	return nil
+}
+
+func getTypeEncoderFromExtension(typ reflect.Type) ValEncoder {
+	typeName := typ.String()
+	typeEncoder := typeEncoders[typeName]
+	if typeEncoder != nil {
+		return typeEncoder
+	}
+	if typ.Kind() == reflect.Ptr {
+		typeEncoder := typeEncoders[typ.Elem().String()]
+		if typeEncoder != nil {
+			return &optionalEncoder{typeEncoder}
+		}
+	}
+	return nil
+}