podman
76 строк · 1.8 Кб
1package jsoniter
2
3import (
4"encoding/json"
5"github.com/modern-go/reflect2"
6"unsafe"
7)
8
9var jsonRawMessageType = reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem()
10var jsoniterRawMessageType = reflect2.TypeOfPtr((*RawMessage)(nil)).Elem()
11
12func createEncoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValEncoder {
13if typ == jsonRawMessageType {
14return &jsonRawMessageCodec{}
15}
16if typ == jsoniterRawMessageType {
17return &jsoniterRawMessageCodec{}
18}
19return nil
20}
21
22func createDecoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValDecoder {
23if typ == jsonRawMessageType {
24return &jsonRawMessageCodec{}
25}
26if typ == jsoniterRawMessageType {
27return &jsoniterRawMessageCodec{}
28}
29return nil
30}
31
32type jsonRawMessageCodec struct {
33}
34
35func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
36if iter.ReadNil() {
37*((*json.RawMessage)(ptr)) = nil
38} else {
39*((*json.RawMessage)(ptr)) = iter.SkipAndReturnBytes()
40}
41}
42
43func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
44if *((*json.RawMessage)(ptr)) == nil {
45stream.WriteNil()
46} else {
47stream.WriteRaw(string(*((*json.RawMessage)(ptr))))
48}
49}
50
51func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
52return len(*((*json.RawMessage)(ptr))) == 0
53}
54
55type jsoniterRawMessageCodec struct {
56}
57
58func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {
59if iter.ReadNil() {
60*((*RawMessage)(ptr)) = nil
61} else {
62*((*RawMessage)(ptr)) = iter.SkipAndReturnBytes()
63}
64}
65
66func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) {
67if *((*RawMessage)(ptr)) == nil {
68stream.WriteNil()
69} else {
70stream.WriteRaw(string(*((*RawMessage)(ptr))))
71}
72}
73
74func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool {
75return len(*((*RawMessage)(ptr))) == 0
76}
77