package msgpack
import (
"fmt"
"math"
"reflect"
"github.com/vmihailenco/msgpack/v5/msgpcode"
)
func (d *Decoder ) skipN (n int ) error {
_ , err := d .readN (n )
return err
}
func (d *Decoder ) uint8 () (uint8 , error ) {
c , err := d .readCode ()
if err != nil {
return 0 , err
}
return c , nil
}
func (d *Decoder ) int8 () (int8 , error ) {
n , err := d .uint8 ()
return int8 (n ), err
}
func (d *Decoder ) uint16 () (uint16 , error ) {
b , err := d .readN (2 )
if err != nil {
return 0 , err
}
return (uint16 (b [0 ]) << 8 ) | uint16 (b [1 ]), nil
}
func (d *Decoder ) int16 () (int16 , error ) {
n , err := d .uint16 ()
return int16 (n ), err
}
func (d *Decoder ) uint32 () (uint32 , error ) {
b , err := d .readN (4 )
if err != nil {
return 0 , err
}
n := (uint32 (b [0 ]) << 24 ) |
(uint32 (b [1 ]) << 16 ) |
(uint32 (b [2 ]) << 8 ) |
uint32 (b [3 ])
return n , nil
}
func (d *Decoder ) int32 () (int32 , error ) {
n , err := d .uint32 ()
return int32 (n ), err
}
func (d *Decoder ) uint64 () (uint64 , error ) {
b , err := d .readN (8 )
if err != nil {
return 0 , err
}
n := (uint64 (b [0 ]) << 56 ) |
(uint64 (b [1 ]) << 48 ) |
(uint64 (b [2 ]) << 40 ) |
(uint64 (b [3 ]) << 32 ) |
(uint64 (b [4 ]) << 24 ) |
(uint64 (b [5 ]) << 16 ) |
(uint64 (b [6 ]) << 8 ) |
uint64 (b [7 ])
return n , nil
}
func (d *Decoder ) int64 () (int64 , error ) {
n , err := d .uint64 ()
return int64 (n ), err
}
func (d *Decoder ) DecodeUint64 () (uint64 , error ) {
c , err := d .readCode ()
if err != nil {
return 0 , err
}
return d .uint (c )
}
func (d *Decoder ) uint (c byte ) (uint64 , error ) {
if c == msgpcode .Nil {
return 0 , nil
}
if msgpcode .IsFixedNum (c ) {
return uint64 (int8 (c )), nil
}
switch c {
case msgpcode .Uint8 :
n , err := d .uint8 ()
return uint64 (n ), err
case msgpcode .Int8 :
n , err := d .int8 ()
return uint64 (n ), err
case msgpcode .Uint16 :
n , err := d .uint16 ()
return uint64 (n ), err
case msgpcode .Int16 :
n , err := d .int16 ()
return uint64 (n ), err
case msgpcode .Uint32 :
n , err := d .uint32 ()
return uint64 (n ), err
case msgpcode .Int32 :
n , err := d .int32 ()
return uint64 (n ), err
case msgpcode .Uint64 , msgpcode .Int64 :
return d .uint64 ()
}
return 0 , fmt .Errorf ("msgpack: invalid code=%x decoding uint64" , c )
}
func (d *Decoder ) DecodeInt64 () (int64 , error ) {
c , err := d .readCode ()
if err != nil {
return 0 , err
}
return d .int (c )
}
func (d *Decoder ) int (c byte ) (int64 , error ) {
if c == msgpcode .Nil {
return 0 , nil
}
if msgpcode .IsFixedNum (c ) {
return int64 (int8 (c )), nil
}
switch c {
case msgpcode .Uint8 :
n , err := d .uint8 ()
return int64 (n ), err
case msgpcode .Int8 :
n , err := d .uint8 ()
return int64 (int8 (n )), err
case msgpcode .Uint16 :
n , err := d .uint16 ()
return int64 (n ), err
case msgpcode .Int16 :
n , err := d .uint16 ()
return int64 (int16 (n )), err
case msgpcode .Uint32 :
n , err := d .uint32 ()
return int64 (n ), err
case msgpcode .Int32 :
n , err := d .uint32 ()
return int64 (int32 (n )), err
case msgpcode .Uint64 , msgpcode .Int64 :
n , err := d .uint64 ()
return int64 (n ), err
}
return 0 , fmt .Errorf ("msgpack: invalid code=%x decoding int64" , c )
}
func (d *Decoder ) DecodeFloat32 () (float32 , error ) {
c , err := d .readCode ()
if err != nil {
return 0 , err
}
return d .float32 (c )
}
func (d *Decoder ) float32 (c byte ) (float32 , error ) {
if c == msgpcode .Float {
n , err := d .uint32 ()
if err != nil {
return 0 , err
}
return math .Float32frombits (n ), nil
}
n , err := d .int (c )
if err != nil {
return 0 , fmt .Errorf ("msgpack: invalid code=%x decoding float32" , c )
}
return float32 (n ), nil
}
func (d *Decoder ) DecodeFloat64 () (float64 , error ) {
c , err := d .readCode ()
if err != nil {
return 0 , err
}
return d .float64 (c )
}
func (d *Decoder ) float64 (c byte ) (float64 , error ) {
switch c {
case msgpcode .Float :
n , err := d .float32 (c )
if err != nil {
return 0 , err
}
return float64 (n ), nil
case msgpcode .Double :
n , err := d .uint64 ()
if err != nil {
return 0 , err
}
return math .Float64frombits (n ), nil
}
n , err := d .int (c )
if err != nil {
return 0 , fmt .Errorf ("msgpack: invalid code=%x decoding float32" , c )
}
return float64 (n ), nil
}
func (d *Decoder ) DecodeUint () (uint , error ) {
n , err := d .DecodeUint64 ()
return uint (n ), err
}
func (d *Decoder ) DecodeUint8 () (uint8 , error ) {
n , err := d .DecodeUint64 ()
return uint8 (n ), err
}
func (d *Decoder ) DecodeUint16 () (uint16 , error ) {
n , err := d .DecodeUint64 ()
return uint16 (n ), err
}
func (d *Decoder ) DecodeUint32 () (uint32 , error ) {
n , err := d .DecodeUint64 ()
return uint32 (n ), err
}
func (d *Decoder ) DecodeInt () (int , error ) {
n , err := d .DecodeInt64 ()
return int (n ), err
}
func (d *Decoder ) DecodeInt8 () (int8 , error ) {
n , err := d .DecodeInt64 ()
return int8 (n ), err
}
func (d *Decoder ) DecodeInt16 () (int16 , error ) {
n , err := d .DecodeInt64 ()
return int16 (n ), err
}
func (d *Decoder ) DecodeInt32 () (int32 , error ) {
n , err := d .DecodeInt64 ()
return int32 (n ), err
}
func decodeFloat32Value(d *Decoder , v reflect .Value ) error {
f , err := d .DecodeFloat32 ()
if err != nil {
return err
}
v .SetFloat (float64 (f ))
return nil
}
func decodeFloat64Value(d *Decoder , v reflect .Value ) error {
f , err := d .DecodeFloat64 ()
if err != nil {
return err
}
v .SetFloat (f )
return nil
}
func decodeInt64Value(d *Decoder , v reflect .Value ) error {
n , err := d .DecodeInt64 ()
if err != nil {
return err
}
v .SetInt (n )
return nil
}
func decodeUint64Value(d *Decoder , v reflect .Value ) error {
n , err := d .DecodeUint64 ()
if err != nil {
return err
}
v .SetUint (n )
return nil
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .