summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/francoispqt/gojay/decode_unsafe.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/francoispqt/gojay/decode_unsafe.go')
-rw-r--r--vendor/github.com/francoispqt/gojay/decode_unsafe.go120
1 files changed, 120 insertions, 0 deletions
diff --git a/vendor/github.com/francoispqt/gojay/decode_unsafe.go b/vendor/github.com/francoispqt/gojay/decode_unsafe.go
new file mode 100644
index 00000000..54448fba
--- /dev/null
+++ b/vendor/github.com/francoispqt/gojay/decode_unsafe.go
@@ -0,0 +1,120 @@
+package gojay
+
+import (
+ "fmt"
+)
+
+// Unsafe is the structure holding the unsafe version of the API.
+// The difference between unsafe api and regular api is that the regular API
+// copies the buffer passed to Unmarshal functions to a new internal buffer.
+// Making it safer because internally GoJay uses unsafe.Pointer to transform slice of bytes into a string.
+var Unsafe = decUnsafe{}
+
+type decUnsafe struct{}
+
+func (u decUnsafe) UnmarshalJSONArray(data []byte, v UnmarshalerJSONArray) error {
+ dec := borrowDecoder(nil, 0)
+ defer dec.Release()
+ dec.data = data
+ dec.length = len(data)
+ _, err := dec.decodeArray(v)
+ return err
+}
+
+func (u decUnsafe) UnmarshalJSONObject(data []byte, v UnmarshalerJSONObject) error {
+ dec := borrowDecoder(nil, 0)
+ defer dec.Release()
+ dec.data = data
+ dec.length = len(data)
+ _, err := dec.decodeObject(v)
+ return err
+}
+
+func (u decUnsafe) Unmarshal(data []byte, v interface{}) error {
+ var err error
+ var dec *Decoder
+ switch vt := v.(type) {
+ case *string:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeString(vt)
+ case *int:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeInt(vt)
+ case *int8:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeInt8(vt)
+ case *int16:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeInt16(vt)
+ case *int32:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeInt32(vt)
+ case *int64:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeInt64(vt)
+ case *uint8:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeUint8(vt)
+ case *uint16:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeUint16(vt)
+ case *uint32:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeUint32(vt)
+ case *uint64:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeUint64(vt)
+ case *float64:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeFloat64(vt)
+ case *float32:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeFloat32(vt)
+ case *bool:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ err = dec.decodeBool(vt)
+ case UnmarshalerJSONObject:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ _, err = dec.decodeObject(vt)
+ case UnmarshalerJSONArray:
+ dec = borrowDecoder(nil, 0)
+ dec.length = len(data)
+ dec.data = data
+ _, err = dec.decodeArray(vt)
+ default:
+ return InvalidUnmarshalError(fmt.Sprintf(invalidUnmarshalErrorMsg, vt))
+ }
+ defer dec.Release()
+ if err != nil {
+ return err
+ }
+ return dec.err
+}