Explorar el Código

use extension to implement EscapeHtml config option

Tao Wen hace 7 años
padre
commit
2074f25bd3
Se han modificado 2 ficheros con 33 adiciones y 3 borrados
  1. 7 3
      feature_config.go
  2. 26 0
      feature_reflect_extension.go

+ 7 - 3
feature_config.go

@@ -74,8 +74,9 @@ func (cfg Config) Froze() API {
 	if cfg.MarshalFloatWith6Digits {
 		api.marshalFloatWith6Digits()
 	}
+	encoderExtension := EncoderExtension{}
 	if cfg.EscapeHTML {
-		api.escapeHTML()
+		api.escapeHTML(encoderExtension)
 	}
 	if cfg.UseNumber {
 		api.useNumber()
@@ -83,6 +84,9 @@ func (cfg Config) Froze() API {
 	if cfg.ValidateJsonRawMessage {
 		api.validateJsonRawMessage()
 	}
+	if len(encoderExtension) > 0 {
+		api.extensions = append(api.extensions, encoderExtension)
+	}
 	api.configBeforeFrozen = cfg
 	return api
 }
@@ -178,8 +182,8 @@ func (encoder *htmlEscapedStringEncoder) IsEmpty(ptr unsafe.Pointer) bool {
 	return *((*string)(ptr)) == ""
 }
 
-func (cfg *frozenConfig) escapeHTML() {
-	cfg.addEncoderToCache(reflect.TypeOf((*string)(nil)).Elem(), &htmlEscapedStringEncoder{})
+func (cfg *frozenConfig) escapeHTML(encoderExtension EncoderExtension) {
+	encoderExtension[reflect.TypeOf((*string)(nil)).Elem()] = &htmlEscapedStringEncoder{}
 }
 
 func (cfg *frozenConfig) cleanDecoders() {

+ 26 - 0
feature_reflect_extension.go

@@ -80,6 +80,32 @@ func (extension *DummyExtension) DecorateEncoder(typ reflect.Type, encoder ValEn
 	return encoder
 }
 
+type EncoderExtension map[reflect.Type]ValEncoder
+
+// UpdateStructDescriptor No-op
+func (extension EncoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) {
+}
+
+// CreateDecoder No-op
+func (extension EncoderExtension) CreateDecoder(typ reflect.Type) ValDecoder {
+	return nil
+}
+
+// CreateEncoder get encoder from map
+func (extension EncoderExtension) CreateEncoder(typ reflect.Type) ValEncoder {
+	return extension[typ]
+}
+
+// DecorateDecoder No-op
+func (extension EncoderExtension) DecorateDecoder(typ reflect.Type, decoder ValDecoder) ValDecoder {
+	return decoder
+}
+
+// DecorateEncoder No-op
+func (extension EncoderExtension) DecorateEncoder(typ reflect.Type, encoder ValEncoder) ValEncoder {
+	return encoder
+}
+
 type funcDecoder struct {
 	fun DecoderFunc
 }