|
@@ -49,6 +49,33 @@ func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder {
|
|
|
return decoder
|
|
return decoder
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ ptrType := reflect2.PtrTo(typ)
|
|
|
|
|
+ if ptrType.Implements(unmarshalerType) {
|
|
|
|
|
+ return &referenceDecoder{
|
|
|
|
|
+ &unmarshalerDecoder{
|
|
|
|
|
+ valType: ptrType,
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if typ.Implements(unmarshalerType) {
|
|
|
|
|
+ return &unmarshalerDecoder{
|
|
|
|
|
+ valType: typ,
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if ptrType.Implements(textUnmarshalerType) {
|
|
|
|
|
+ return &referenceDecoder{
|
|
|
|
|
+ &textUnmarshalerDecoder{
|
|
|
|
|
+ valType: ptrType,
|
|
|
|
|
+ },
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if typ.Implements(textUnmarshalerType) {
|
|
|
|
|
+ return &textUnmarshalerDecoder{
|
|
|
|
|
+ valType: typ,
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
switch typ.Kind() {
|
|
switch typ.Kind() {
|
|
|
case reflect.String:
|
|
case reflect.String:
|
|
|
return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
|
|
return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
|
|
@@ -63,31 +90,6 @@ func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder {
|
|
|
typ = reflect2.DefaultTypeOfKind(typ.Kind())
|
|
typ = reflect2.DefaultTypeOfKind(typ.Kind())
|
|
|
return &numericMapKeyDecoder{decoderOfType(ctx, typ)}
|
|
return &numericMapKeyDecoder{decoderOfType(ctx, typ)}
|
|
|
default:
|
|
default:
|
|
|
- ptrType := reflect2.PtrTo(typ)
|
|
|
|
|
- if ptrType.Implements(unmarshalerType) {
|
|
|
|
|
- return &referenceDecoder{
|
|
|
|
|
- &unmarshalerDecoder{
|
|
|
|
|
- valType: ptrType,
|
|
|
|
|
- },
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- if typ.Implements(unmarshalerType) {
|
|
|
|
|
- return &unmarshalerDecoder{
|
|
|
|
|
- valType: typ,
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- if ptrType.Implements(textUnmarshalerType) {
|
|
|
|
|
- return &referenceDecoder{
|
|
|
|
|
- &textUnmarshalerDecoder{
|
|
|
|
|
- valType: ptrType,
|
|
|
|
|
- },
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- if typ.Implements(textUnmarshalerType) {
|
|
|
|
|
- return &textUnmarshalerDecoder{
|
|
|
|
|
- valType: typ,
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)}
|
|
return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -103,6 +105,19 @@ func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {
|
|
|
return encoder
|
|
return encoder
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ if typ == textMarshalerType {
|
|
|
|
|
+ return &directTextMarshalerEncoder{
|
|
|
|
|
+ stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if typ.Implements(textMarshalerType) {
|
|
|
|
|
+ return &textMarshalerEncoder{
|
|
|
|
|
+ valType: typ,
|
|
|
|
|
+ stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
switch typ.Kind() {
|
|
switch typ.Kind() {
|
|
|
case reflect.String:
|
|
case reflect.String:
|
|
|
return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
|
|
return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String))
|
|
@@ -117,17 +132,6 @@ func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder {
|
|
|
typ = reflect2.DefaultTypeOfKind(typ.Kind())
|
|
typ = reflect2.DefaultTypeOfKind(typ.Kind())
|
|
|
return &numericMapKeyEncoder{encoderOfType(ctx, typ)}
|
|
return &numericMapKeyEncoder{encoderOfType(ctx, typ)}
|
|
|
default:
|
|
default:
|
|
|
- if typ == textMarshalerType {
|
|
|
|
|
- return &directTextMarshalerEncoder{
|
|
|
|
|
- stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- if typ.Implements(textMarshalerType) {
|
|
|
|
|
- return &textMarshalerEncoder{
|
|
|
|
|
- valType: typ,
|
|
|
|
|
- stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")),
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
if typ.Kind() == reflect.Interface {
|
|
if typ.Kind() == reflect.Interface {
|
|
|
return &dynamicMapKeyEncoder{ctx, typ}
|
|
return &dynamicMapKeyEncoder{ctx, typ}
|
|
|
}
|
|
}
|