github.com/zerosnake0/jzon@v0.0.9-0.20230801092939-1b135cb83f7f/val_decoder.go (about)

     1  package jzon
     2  
     3  import (
     4  	"encoding/json"
     5  	"reflect"
     6  	"strconv"
     7  	"unsafe"
     8  )
     9  
    10  var (
    11  	globalValDecoders = map[rtype]ValDecoder{}
    12  	decoderKindMap    = [numKinds]rtype{}
    13  	kindDecoders      = [numKinds]ValDecoder{}
    14  	keyDecoders       = [numKinds]ValDecoder{}
    15  )
    16  
    17  func createGlobalValDecoder(ptr interface{}, dec ValDecoder) {
    18  	ef := (*eface)(unsafe.Pointer(&ptr))
    19  	globalValDecoders[ef.rtype] = dec
    20  }
    21  
    22  func mapDecoderKind(ptr interface{}, dec ValDecoder) {
    23  	ef := (*eface)(unsafe.Pointer(&ptr))
    24  	kind := reflect.TypeOf(ptr).Elem().Kind()
    25  	decoderKindMap[kind] = ef.rtype
    26  	kindDecoders[kind] = dec
    27  }
    28  
    29  func mapKeyDecoder(ptr interface{}, dec ValDecoder) {
    30  	ptrType := reflect.TypeOf(ptr)
    31  	kind := ptrType.Elem().Kind()
    32  	keyDecoders[kind] = dec
    33  }
    34  
    35  func init() {
    36  	// standard json library types
    37  	createGlobalValDecoder((*json.Number)(nil), (*jsonNumberDecoder)(nil))
    38  	createGlobalValDecoder((*json.RawMessage)(nil), (*jsonRawMessageDecoder)(nil))
    39  
    40  	// kind mapping
    41  	mapDecoderKind((*bool)(nil), (*boolDecoder)(nil))
    42  	mapDecoderKind((*string)(nil), (*stringDecoder)(nil))
    43  	if strconv.IntSize == 32 {
    44  		mapDecoderKind((*int)(nil), (*int32Decoder)(nil))
    45  		mapDecoderKind((*uint)(nil), (*uint32Decoder)(nil))
    46  	} else {
    47  		mapDecoderKind((*int)(nil), (*int64Decoder)(nil))
    48  		mapDecoderKind((*uint)(nil), (*uint64Decoder)(nil))
    49  	}
    50  	if unsafe.Sizeof(uintptr(0)) == 4 {
    51  		mapDecoderKind((*uintptr)(nil), (*uint32Decoder)(nil))
    52  	} else {
    53  		mapDecoderKind((*uintptr)(nil), (*uint64Decoder)(nil))
    54  	}
    55  	mapDecoderKind((*int8)(nil), (*int8Decoder)(nil))
    56  	mapDecoderKind((*int16)(nil), (*int16Decoder)(nil))
    57  	mapDecoderKind((*int32)(nil), (*int32Decoder)(nil))
    58  	mapDecoderKind((*int64)(nil), (*int64Decoder)(nil))
    59  	mapDecoderKind((*uint8)(nil), (*uint8Decoder)(nil))
    60  	mapDecoderKind((*uint16)(nil), (*uint16Decoder)(nil))
    61  	mapDecoderKind((*uint32)(nil), (*uint32Decoder)(nil))
    62  	mapDecoderKind((*uint64)(nil), (*uint64Decoder)(nil))
    63  	mapDecoderKind((*float32)(nil), (*float32Decoder)(nil))
    64  	mapDecoderKind((*float64)(nil), (*float64Decoder)(nil))
    65  
    66  	// object key decoders
    67  	mapKeyDecoder((*string)(nil), (*stringDecoder)(nil))
    68  	if strconv.IntSize == 32 {
    69  		mapKeyDecoder((*int)(nil), (*int32Decoder)(nil))
    70  		mapKeyDecoder((*uint)(nil), (*uint32Decoder)(nil))
    71  	} else {
    72  		mapKeyDecoder((*int)(nil), (*int64Decoder)(nil))
    73  		mapKeyDecoder((*uint)(nil), (*uint64Decoder)(nil))
    74  	}
    75  	mapKeyDecoder((*int8)(nil), (*int8Decoder)(nil))
    76  	mapKeyDecoder((*int16)(nil), (*int16Decoder)(nil))
    77  	mapKeyDecoder((*int32)(nil), (*int32Decoder)(nil))
    78  	mapKeyDecoder((*int64)(nil), (*int64Decoder)(nil))
    79  	mapKeyDecoder((*uint8)(nil), (*uint8Decoder)(nil))
    80  	mapKeyDecoder((*uint16)(nil), (*uint16Decoder)(nil))
    81  	mapKeyDecoder((*uint32)(nil), (*uint32Decoder)(nil))
    82  	mapKeyDecoder((*uint64)(nil), (*uint64Decoder)(nil))
    83  	if unsafe.Sizeof(uintptr(0)) == 4 {
    84  		mapKeyDecoder((*uintptr)(nil), (*uint32Decoder)(nil))
    85  	} else {
    86  		mapKeyDecoder((*uintptr)(nil), (*uint64Decoder)(nil))
    87  	}
    88  }
    89  
    90  // DecOpts is the context related decoding option of the object
    91  type DecOpts struct {
    92  	MapKey bool
    93  	Quoted bool
    94  }
    95  
    96  func (opts *DecOpts) noescape() *DecOpts {
    97  	return (*DecOpts)(noescape(unsafe.Pointer(opts)))
    98  }
    99  
   100  // ValDecoder is the interface to be implemented for custom decoder
   101  type ValDecoder interface {
   102  	Decode(ptr unsafe.Pointer, it *Iterator, opts *DecOpts) error
   103  }
   104  
   105  type notSupportedDecoder string
   106  
   107  func (dec notSupportedDecoder) Decode(ptr unsafe.Pointer, it *Iterator, _ *DecOpts) error {
   108  	return TypeNotSupportedError(dec)
   109  }