78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
package decoding
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"reflect"
|
|
|
|
"github.com/shamaton/msgpack/v2/def"
|
|
)
|
|
|
|
var emptyString = ""
|
|
var emptyBytes = []byte{}
|
|
|
|
func (d *decoder) isCodeString(code byte) bool {
|
|
return d.isFixString(code) || code == def.Str8 || code == def.Str16 || code == def.Str32
|
|
}
|
|
|
|
func (d *decoder) isFixString(v byte) bool {
|
|
return def.FixStr <= v && v <= def.FixStr+0x1f
|
|
}
|
|
|
|
func (d *decoder) stringByteLength(offset int, k reflect.Kind) (int, int, error) {
|
|
code, offset, err := d.readSize1(offset)
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
|
|
if def.FixStr <= code && code <= def.FixStr+0x1f {
|
|
l := int(code - def.FixStr)
|
|
return l, offset, nil
|
|
} else if code == def.Str8 {
|
|
b, offset, err := d.readSize1(offset)
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
return int(b), offset, nil
|
|
} else if code == def.Str16 {
|
|
b, offset, err := d.readSize2(offset)
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
return int(binary.BigEndian.Uint16(b)), offset, nil
|
|
} else if code == def.Str32 {
|
|
b, offset, err := d.readSize4(offset)
|
|
if err != nil {
|
|
return 0, 0, err
|
|
}
|
|
return int(binary.BigEndian.Uint32(b)), offset, nil
|
|
} else if code == def.Nil {
|
|
return 0, offset, nil
|
|
}
|
|
return 0, 0, d.errorTemplate(code, k)
|
|
}
|
|
|
|
func (d *decoder) asString(offset int, k reflect.Kind) (string, int, error) {
|
|
bs, offset, err := d.asStringByte(offset, k)
|
|
if err != nil {
|
|
return emptyString, 0, err
|
|
}
|
|
return string(bs), offset, nil
|
|
}
|
|
|
|
func (d *decoder) asStringByte(offset int, k reflect.Kind) ([]byte, int, error) {
|
|
l, offset, err := d.stringByteLength(offset, k)
|
|
if err != nil {
|
|
return emptyBytes, 0, err
|
|
}
|
|
|
|
return d.asStringByteByLength(offset, l, k)
|
|
}
|
|
|
|
func (d *decoder) asStringByteByLength(offset int, l int, k reflect.Kind) ([]byte, int, error) {
|
|
if l < 1 {
|
|
return emptyBytes, offset, nil
|
|
}
|
|
|
|
return d.readSizeN(offset, l)
|
|
}
|