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  }