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 }