diff --git a/feature_config.go b/feature_config.go index 2778891..257fd06 100644 --- a/feature_config.go +++ b/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() { diff --git a/feature_reflect_extension.go b/feature_reflect_extension.go index efcda5c..818f726 100644 --- a/feature_reflect_extension.go +++ b/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 }