podman
112 строк · 2.6 Кб
1package jsoniter2
3import (4"encoding/json"5"github.com/modern-go/reflect2"6"strconv"7"unsafe"8)
9
10type Number string11
12// String returns the literal text of the number.
13func (n Number) String() string { return string(n) }14
15// Float64 returns the number as a float64.
16func (n Number) Float64() (float64, error) {17return strconv.ParseFloat(string(n), 64)18}
19
20// Int64 returns the number as an int64.
21func (n Number) Int64() (int64, error) {22return strconv.ParseInt(string(n), 10, 64)23}
24
25func CastJsonNumber(val interface{}) (string, bool) {26switch typedVal := val.(type) {27case json.Number:28return string(typedVal), true29case Number:30return string(typedVal), true31}32return "", false33}
34
35var jsonNumberType = reflect2.TypeOfPtr((*json.Number)(nil)).Elem()36var jsoniterNumberType = reflect2.TypeOfPtr((*Number)(nil)).Elem()37
38func createDecoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValDecoder {39if typ.AssignableTo(jsonNumberType) {40return &jsonNumberCodec{}41}42if typ.AssignableTo(jsoniterNumberType) {43return &jsoniterNumberCodec{}44}45return nil46}
47
48func createEncoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValEncoder {49if typ.AssignableTo(jsonNumberType) {50return &jsonNumberCodec{}51}52if typ.AssignableTo(jsoniterNumberType) {53return &jsoniterNumberCodec{}54}55return nil56}
57
58type jsonNumberCodec struct {59}
60
61func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {62switch iter.WhatIsNext() {63case StringValue:64*((*json.Number)(ptr)) = json.Number(iter.ReadString())65case NilValue:66iter.skipFourBytes('n', 'u', 'l', 'l')67*((*json.Number)(ptr)) = ""68default:69*((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString()))70}71}
72
73func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {74number := *((*json.Number)(ptr))75if len(number) == 0 {76stream.writeByte('0')77} else {78stream.WriteRaw(string(number))79}80}
81
82func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {83return len(*((*json.Number)(ptr))) == 084}
85
86type jsoniterNumberCodec struct {87}
88
89func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) {90switch iter.WhatIsNext() {91case StringValue:92*((*Number)(ptr)) = Number(iter.ReadString())93case NilValue:94iter.skipFourBytes('n', 'u', 'l', 'l')95*((*Number)(ptr)) = ""96default:97*((*Number)(ptr)) = Number([]byte(iter.readNumberAsString()))98}99}
100
101func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) {102number := *((*Number)(ptr))103if len(number) == 0 {104stream.writeByte('0')105} else {106stream.WriteRaw(string(number))107}108}
109
110func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool {111return len(*((*Number)(ptr))) == 0112}
113