Skip to content
This repository was archived by the owner on Dec 15, 2025. It is now read-only.

Commit b795877

Browse files
committed
move any codec
1 parent 63ea5e3 commit b795877

File tree

2 files changed

+53
-39
lines changed

2 files changed

+53
-39
lines changed

any.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,32 @@ func locatePath(iter *Iterator, path []interface{}) Any {
245245
return iter.readAny()
246246
}
247247

248+
var anyType = reflect.TypeOf((*Any)(nil)).Elem()
249+
250+
func createDecoderOfAny(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
251+
if typ == anyType {
252+
return &directAnyCodec{}
253+
}
254+
if typ.Implements(anyType) {
255+
return &anyCodec{
256+
valType: reflect2.Type2(typ),
257+
}
258+
}
259+
return nil
260+
}
261+
262+
func createEncoderOfAny(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
263+
if typ == anyType {
264+
return &directAnyCodec{}
265+
}
266+
if typ.Implements(anyType) {
267+
return &anyCodec{
268+
valType: reflect2.Type2(typ),
269+
}
270+
}
271+
return nil
272+
}
273+
248274
type anyCodec struct {
249275
valType reflect2.Type
250276
}
@@ -280,4 +306,4 @@ func (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
280306
func (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool {
281307
any := *(*Any)(ptr)
282308
return any.Size() == 0
283-
}
309+
}

reflect.go

Lines changed: 26 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ type checkIsEmpty interface {
3838

3939
var jsonRawMessageType reflect.Type
4040
var jsoniterRawMessageType reflect.Type
41-
var anyType reflect.Type
4241
var marshalerType reflect.Type
4342
var unmarshalerType reflect.Type
4443
var textMarshalerType reflect.Type
@@ -47,7 +46,6 @@ var textUnmarshalerType reflect.Type
4746
func init() {
4847
jsonRawMessageType = reflect.TypeOf((*json.RawMessage)(nil)).Elem()
4948
jsoniterRawMessageType = reflect.TypeOf((*RawMessage)(nil)).Elem()
50-
anyType = reflect.TypeOf((*Any)(nil)).Elem()
5149
marshalerType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
5250
unmarshalerType = reflect.TypeOf((*json.Unmarshaler)(nil)).Elem()
5351
textMarshalerType = reflect.TypeOf((*encoding.TextMarshaler)(nil)).Elem()
@@ -105,7 +103,6 @@ func decoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecode
105103
}
106104

107105
func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) ValDecoder {
108-
typeName := typ.String()
109106
decoder := createDecoderOfJsonRawMessage(cfg, prefix, typ)
110107
if decoder != nil {
111108
return decoder
@@ -118,11 +115,9 @@ func createDecoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
118115
if decoder != nil {
119116
return decoder
120117
}
121-
if typ == anyType {
122-
return &directAnyCodec{}
123-
}
124-
if typ.Implements(anyType) {
125-
return &anyCodec{}
118+
decoder = createDecoderOfAny(cfg, prefix, typ)
119+
if decoder != nil {
120+
return decoder
126121
}
127122
decoder = createDecoderOfNative(cfg, prefix, typ)
128123
if decoder != nil {
@@ -230,15 +225,31 @@ func createEncoderOfType(cfg *frozenConfig, prefix string, typ reflect.Type) Val
230225
if encoder != nil {
231226
return encoder
232227
}
233-
if typ == anyType {
234-
return &directAnyCodec{}
228+
encoder = createEncoderOfAny(cfg, prefix, typ)
229+
if encoder != nil {
230+
return encoder
235231
}
236-
if typ.Implements(anyType) {
237-
return &anyCodec{
238-
valType: reflect2.Type2(typ),
239-
}
232+
encoder = createEncoderOfNative(cfg, prefix, typ)
233+
if encoder != nil {
234+
return encoder
235+
}
236+
kind := typ.Kind()
237+
switch kind {
238+
case reflect.Interface:
239+
return &dynamicEncoder{reflect2.Type2(typ)}
240+
case reflect.Struct:
241+
return encoderOfStruct(cfg, prefix, typ)
242+
case reflect.Array:
243+
return encoderOfArray(cfg, prefix, typ)
244+
case reflect.Slice:
245+
return encoderOfSlice(cfg, prefix, typ)
246+
case reflect.Map:
247+
return encoderOfMap(cfg, prefix, typ)
248+
case reflect.Ptr:
249+
return encoderOfOptional(cfg, prefix, typ)
250+
default:
251+
return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
240252
}
241-
return createEncoderOfSimpleType(cfg, prefix, typ)
242253
}
243254

244255
func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
@@ -291,29 +302,6 @@ func createCheckIsEmpty(cfg *frozenConfig, typ reflect.Type) checkIsEmpty {
291302
}
292303
}
293304

294-
func createEncoderOfSimpleType(cfg *frozenConfig, prefix string, typ reflect.Type) ValEncoder {
295-
encoder := createEncoderOfNative(cfg, prefix, typ)
296-
if encoder != nil {
297-
return encoder
298-
}
299-
kind := typ.Kind()
300-
switch kind {
301-
case reflect.Interface:
302-
return &dynamicEncoder{reflect2.Type2(typ)}
303-
case reflect.Struct:
304-
return encoderOfStruct(cfg, prefix, typ)
305-
case reflect.Array:
306-
return encoderOfArray(cfg, prefix, typ)
307-
case reflect.Slice:
308-
return encoderOfSlice(cfg, prefix, typ)
309-
case reflect.Map:
310-
return encoderOfMap(cfg, prefix, typ)
311-
case reflect.Ptr:
312-
return encoderOfOptional(cfg, prefix, typ)
313-
default:
314-
return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", prefix, typ.String())}
315-
}
316-
}
317305

318306
type placeholderDecoder struct {
319307
cfg *frozenConfig

0 commit comments

Comments
 (0)