Skip to content

Commit ff2b70c

Browse files
committed
support config level extension
1 parent f7279a6 commit ff2b70c

File tree

3 files changed

+37
-9
lines changed

3 files changed

+37
-9
lines changed

feature_config.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ type API interface {
4848
NewEncoder(writer io.Writer) *Encoder
4949
NewDecoder(reader io.Reader) *Decoder
5050
Valid(data []byte) bool
51+
RegisterExtension(extension Extension)
5152
}
5253

5354
// ConfigDefault the default API
@@ -132,7 +133,7 @@ func (cfg *frozenConfig) getTagKey() string {
132133
return tagKey
133134
}
134135

135-
func (cfg *frozenConfig) registerExtension(extension Extension) {
136+
func (cfg *frozenConfig) RegisterExtension(extension Extension) {
136137
cfg.extensions = append(cfg.extensions, extension)
137138
}
138139

feature_reflect.go

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
274274
if decoder != nil {
275275
return decoder, nil
276276
}
277-
decoder = getTypeDecoderFromExtension(typ)
277+
decoder = getTypeDecoderFromExtension(cfg, typ)
278278
if decoder != nil {
279279
cfg.addDecoderToCache(cacheKey, decoder)
280280
return decoder, nil
@@ -285,6 +285,9 @@ func decoderOfType(cfg *frozenConfig, typ reflect.Type) (ValDecoder, error) {
285285
for _, extension := range extensions {
286286
decoder = extension.DecorateDecoder(typ, decoder)
287287
}
288+
for _, extension := range cfg.extensions {
289+
decoder = extension.DecorateDecoder(typ, decoder)
290+
}
288291
cfg.addDecoderToCache(cacheKey, decoder)
289292
return decoder, err
290293
}
@@ -441,7 +444,7 @@ func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
441444
if encoder != nil {
442445
return encoder, nil
443446
}
444-
encoder = getTypeEncoderFromExtension(typ)
447+
encoder = getTypeEncoderFromExtension(cfg, typ)
445448
if encoder != nil {
446449
cfg.addEncoderToCache(cacheKey, encoder)
447450
return encoder, nil
@@ -452,6 +455,9 @@ func encoderOfType(cfg *frozenConfig, typ reflect.Type) (ValEncoder, error) {
452455
for _, extension := range extensions {
453456
encoder = extension.DecorateEncoder(typ, encoder)
454457
}
458+
for _, extension := range cfg.extensions {
459+
encoder = extension.DecorateEncoder(typ, encoder)
460+
}
455461
cfg.addEncoderToCache(cacheKey, encoder)
456462
return encoder, err
457463
}

feature_reflect_extension.go

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -161,22 +161,31 @@ func RegisterExtension(extension Extension) {
161161
extensions = append(extensions, extension)
162162
}
163163

164-
func getTypeDecoderFromExtension(typ reflect.Type) ValDecoder {
165-
decoder := _getTypeDecoderFromExtension(typ)
164+
func getTypeDecoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValDecoder {
165+
decoder := _getTypeDecoderFromExtension(cfg, typ)
166166
if decoder != nil {
167167
for _, extension := range extensions {
168168
decoder = extension.DecorateDecoder(typ, decoder)
169169
}
170+
for _, extension := range cfg.extensions {
171+
decoder = extension.DecorateDecoder(typ, decoder)
172+
}
170173
}
171174
return decoder
172175
}
173-
func _getTypeDecoderFromExtension(typ reflect.Type) ValDecoder {
176+
func _getTypeDecoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValDecoder {
174177
for _, extension := range extensions {
175178
decoder := extension.CreateDecoder(typ)
176179
if decoder != nil {
177180
return decoder
178181
}
179182
}
183+
for _, extension := range cfg.extensions {
184+
decoder := extension.CreateDecoder(typ)
185+
if decoder != nil {
186+
return decoder
187+
}
188+
}
180189
typeName := typ.String()
181190
decoder := typeDecoders[typeName]
182191
if decoder != nil {
@@ -191,23 +200,32 @@ func _getTypeDecoderFromExtension(typ reflect.Type) ValDecoder {
191200
return nil
192201
}
193202

194-
func getTypeEncoderFromExtension(typ reflect.Type) ValEncoder {
195-
encoder := _getTypeEncoderFromExtension(typ)
203+
func getTypeEncoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValEncoder {
204+
encoder := _getTypeEncoderFromExtension(cfg, typ)
196205
if encoder != nil {
197206
for _, extension := range extensions {
198207
encoder = extension.DecorateEncoder(typ, encoder)
199208
}
209+
for _, extension := range cfg.extensions {
210+
encoder = extension.DecorateEncoder(typ, encoder)
211+
}
200212
}
201213
return encoder
202214
}
203215

204-
func _getTypeEncoderFromExtension(typ reflect.Type) ValEncoder {
216+
func _getTypeEncoderFromExtension(cfg *frozenConfig, typ reflect.Type) ValEncoder {
205217
for _, extension := range extensions {
206218
encoder := extension.CreateEncoder(typ)
207219
if encoder != nil {
208220
return encoder
209221
}
210222
}
223+
for _, extension := range cfg.extensions {
224+
encoder := extension.CreateEncoder(typ)
225+
if encoder != nil {
226+
return encoder
227+
}
228+
}
211229
typeName := typ.String()
212230
encoder := typeEncoders[typeName]
213231
if encoder != nil {
@@ -324,6 +342,9 @@ func createStructDescriptor(cfg *frozenConfig, typ reflect.Type, bindings []*Bin
324342
for _, extension := range extensions {
325343
extension.UpdateStructDescriptor(structDescriptor)
326344
}
345+
for _, extension := range cfg.extensions {
346+
extension.UpdateStructDescriptor(structDescriptor)
347+
}
327348
processTags(structDescriptor, cfg)
328349
// merge normal & embedded bindings & sort with original order
329350
allBindings := sortableBindings(append(embeddedBindings, structDescriptor.Fields...))

0 commit comments

Comments
 (0)