github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/jsoni/reflect_json_raw_message.go (about) 1 package jsoni 2 3 import ( 4 "context" 5 "encoding/json" 6 "unsafe" 7 8 "github.com/modern-go/reflect2" 9 ) 10 11 var ( 12 jsonRawMessageType = PtrElem((*json.RawMessage)(nil)) 13 jsoniRawMessageType = PtrElem((*RawMessage)(nil)) 14 ) 15 16 func createEncoderOfJsonRawMessage(_ *ctx, typ reflect2.Type) ValEncoder { 17 switch typ { 18 case jsonRawMessageType: 19 return &jsonRawMessageCodec{} 20 case jsoniRawMessageType: 21 return &jsoniRawMessageCodec{} 22 default: 23 return nil 24 } 25 } 26 27 func createDecoderOfJsonRawMessage(_ *ctx, typ reflect2.Type) ValDecoder { 28 switch typ { 29 case jsonRawMessageType: 30 return &jsonRawMessageCodec{} 31 case jsoniRawMessageType: 32 return &jsoniRawMessageCodec{} 33 default: 34 return nil 35 } 36 } 37 38 type jsonRawMessageCodec struct{} 39 40 func (c *jsonRawMessageCodec) Decode(_ context.Context, ptr unsafe.Pointer, iter *Iterator) { 41 if r := (*json.RawMessage)(ptr); iter.ReadNil() { 42 *r = nil 43 } else { 44 *r = iter.SkipAndReturnBytes() 45 } 46 } 47 48 func (c *jsonRawMessageCodec) Encode(_ context.Context, ptr unsafe.Pointer, stream *Stream) { 49 if r := *((*json.RawMessage)(ptr)); r == nil { 50 stream.WriteNil() 51 } else { 52 stream.WriteRaw(string(r)) 53 } 54 } 55 56 func (c *jsonRawMessageCodec) IsEmpty(_ context.Context, p unsafe.Pointer, _ bool) bool { 57 return len(*((*json.RawMessage)(p))) == 0 58 } 59 60 type jsoniRawMessageCodec struct{} 61 62 func (c *jsoniRawMessageCodec) Decode(_ context.Context, ptr unsafe.Pointer, iter *Iterator) { 63 if r := (*RawMessage)(ptr); iter.ReadNil() { 64 *r = nil 65 } else { 66 *r = iter.SkipAndReturnBytes() 67 } 68 } 69 70 func (c *jsoniRawMessageCodec) Encode(_ context.Context, ptr unsafe.Pointer, stream *Stream) { 71 if r := *((*RawMessage)(ptr)); r == nil { 72 stream.WriteNil() 73 } else { 74 stream.WriteRaw(string(r)) 75 } 76 } 77 78 func (c *jsoniRawMessageCodec) IsEmpty(_ context.Context, p unsafe.Pointer, _ bool) bool { 79 return len(*((*RawMessage)(p))) == 0 80 }