Documentation
¶
Index ¶
- Variables
- func AddExtCoder(e ext.Encoder, d ext.Decoder) error
- func AddExtStreamCoder(e ext.StreamEncoder, d ext.StreamDecoder) error
- func Marshal(v interface{}) ([]byte, error)
- func MarshalAsArray(v interface{}) ([]byte, error)
- func MarshalAsMap(v interface{}) ([]byte, error)
- func MarshalWrite(w io.Writer, v interface{}) error
- func MarshalWriteAsArray(w io.Writer, v interface{}) error
- func MarshalWriteAsMap(w io.Writer, v interface{}) error
- func RemoveExtCoder(e ext.Encoder, d ext.Decoder) error
- func RemoveExtStreamCoder(e ext.StreamEncoder, d ext.StreamDecoder) error
- func SetComplexTypeCode(code int8)
- func SetDecodedTimeAsLocal()
- func SetDecodedTimeAsUTC()
- func Unmarshal(data []byte, v interface{}) error
- func UnmarshalAsArray(data []byte, v interface{}) error
- func UnmarshalAsMap(data []byte, v interface{}) error
- func UnmarshalRead(r io.Reader, v interface{}) error
- func UnmarshalReadAsArray(r io.Reader, v interface{}) error
- func UnmarshalReadAsMap(r io.Reader, v interface{}) error
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var Error = def.ErrMsgpack
Error is used in all msgpack error as the based error.
var StructAsArray = false
StructAsArray is encoding option. If this option sets true, default encoding sets to array-format.
Functions ¶
func AddExtCoder ¶
AddExtCoder adds encoders for extension types.
Example ¶
package main
import (
"fmt"
"net"
"reflect"
"github.com/shamaton/msgpack/v2"
"github.com/shamaton/msgpack/v2/def"
"github.com/shamaton/msgpack/v2/ext"
)
func main() {
err := msgpack.AddExtCoder(&IPNetEncoder{}, &IPNetDecoder{})
if err != nil {
panic(err)
}
v1 := net.IPNet{IP: net.IP{127, 0, 0, 1}, Mask: net.IPMask{255, 255, 255, 0}}
r1, err := msgpack.Marshal(v1)
if err != nil {
panic(err)
}
fmt.Printf("encode: % 02x\n", r1)
var v2 net.IPNet
err = msgpack.Unmarshal(r1, &v2)
if err != nil {
panic(err)
}
fmt.Println("decode:", v2)
}
const ipNetCode = 50
type IPNetDecoder struct {
ext.DecoderCommon
}
func (td *IPNetDecoder) Code() int8 {
return ipNetCode
}
func (td *IPNetDecoder) IsType(offset int, d *[]byte) bool {
code, offset := td.ReadSize1(offset, d)
if code == def.Ext8 {
_, offset = td.ReadSize1(offset, d)
t, _ := td.ReadSize1(offset, d)
return int8(t) == td.Code()
}
return false
}
func (td *IPNetDecoder) AsValue(offset int, k reflect.Kind, d *[]byte) (any, int, error) {
code, offset := td.ReadSize1(offset, d)
switch code {
case def.Ext8:
size, offset := td.ReadSize1(offset, d)
_, offset = td.ReadSize1(offset, d)
data, offset := td.ReadSizeN(offset, int(size), d)
_, v, err := net.ParseCIDR(string(data))
if err != nil {
return net.IPNet{}, 0, fmt.Errorf("failed to parse CIDR: %w", err)
}
if v == nil {
return net.IPNet{}, 0, fmt.Errorf("parsed CIDR is nil")
}
return *v, offset, nil
}
return net.IPNet{}, 0, fmt.Errorf("should not reach this line!! code %x decoding %v", td.Code(), k)
}
type IPNetEncoder struct {
ext.EncoderCommon
}
func (s *IPNetEncoder) Code() int8 {
return ipNetCode
}
func (s *IPNetEncoder) Type() reflect.Type {
return reflect.TypeOf(net.IPNet{})
}
func (s *IPNetEncoder) CalcByteSize(value reflect.Value) (int, error) {
v := value.Interface().(net.IPNet)
return def.Byte1 + def.Byte1 + def.Byte1 + len(v.String()), nil
}
func (s *IPNetEncoder) WriteToBytes(value reflect.Value, offset int, bytes *[]byte) int {
v := value.Interface().(net.IPNet)
data := v.String()
offset = s.SetByte1Int(def.Ext8, offset, bytes)
offset = s.SetByte1Int(len(data), offset, bytes)
offset = s.SetByte1Int(int(s.Code()), offset, bytes)
offset = s.SetBytes([]byte(data), offset, bytes)
return offset
}
Output: encode: c7 0c 32 31 32 37 2e 30 2e 30 2e 31 2f 32 34 decode: {127.0.0.0 ffffff00}
func AddExtStreamCoder ¶ added in v2.2.0
func AddExtStreamCoder(e ext.StreamEncoder, d ext.StreamDecoder) error
AddExtStreamCoder adds stream encoders for extension types.
Example ¶
package main
import (
"bytes"
"fmt"
"net"
"reflect"
"github.com/shamaton/msgpack/v2"
"github.com/shamaton/msgpack/v2/def"
"github.com/shamaton/msgpack/v2/ext"
)
func main() {
err := msgpack.AddExtStreamCoder(&IPNetStreamEncoder{}, &IPNetStreamDecoder{})
if err != nil {
panic(err)
}
v1 := net.IPNet{IP: net.IP{127, 0, 0, 1}, Mask: net.IPMask{255, 255, 255, 0}}
buf := bytes.Buffer{}
err = msgpack.MarshalWrite(&buf, v1)
if err != nil {
panic(err)
}
fmt.Printf("encode: % 02x\n", buf.Bytes())
var v2 net.IPNet
err = msgpack.UnmarshalRead(&buf, &v2)
if err != nil {
panic(err)
}
fmt.Println("decode:", v2)
}
const ipNetCode = 50
type IPNetStreamDecoder struct{}
func (td *IPNetStreamDecoder) Code() int8 {
return ipNetCode
}
func (td *IPNetStreamDecoder) IsType(code byte, innerType int8, _ int) bool {
return code == def.Ext8 && innerType == td.Code()
}
func (td *IPNetStreamDecoder) ToValue(code byte, data []byte, k reflect.Kind) (any, error) {
if code == def.Ext8 {
_, v, err := net.ParseCIDR(string(data))
if err != nil {
return net.IPNet{}, fmt.Errorf("failed to parse CIDR: %w", err)
}
if v == nil {
return net.IPNet{}, fmt.Errorf("parsed CIDR is nil")
}
return *v, nil
}
return net.IPNet{}, fmt.Errorf("should not reach this line!! code %x decoding %v", td.Code(), k)
}
type IPNetStreamEncoder struct{}
func (s *IPNetStreamEncoder) Code() int8 {
return ipNetCode
}
func (s *IPNetStreamEncoder) Type() reflect.Type {
return reflect.TypeOf(net.IPNet{})
}
func (s *IPNetStreamEncoder) Write(w ext.StreamWriter, value reflect.Value) error {
v := value.Interface().(net.IPNet)
data := v.String()
if err := w.WriteByte1Int(def.Ext8); err != nil {
return err
}
if err := w.WriteByte1Int(len(data)); err != nil {
return err
}
if err := w.WriteByte1Int(int(s.Code())); err != nil {
return err
}
if err := w.WriteBytes([]byte(data)); err != nil {
return err
}
return nil
}
Output: encode: c7 0c 32 31 32 37 2e 30 2e 30 2e 31 2f 32 34 decode: {127.0.0.0 ffffff00}
func MarshalAsArray ¶
MarshalAsArray encodes data as array format. This is the same thing that StructAsArray sets true.
func MarshalAsMap ¶
MarshalAsMap encodes data as map format. This is the same thing that StructAsArray sets false.
func MarshalWrite ¶ added in v2.2.0
MarshalWrite writes MessagePack-encoded byte array of v to writer.
func MarshalWriteAsArray ¶ added in v2.2.0
MarshalWriteAsArray writes array format encoded data to writer. This is the same thing that StructAsArray sets true.
func MarshalWriteAsMap ¶ added in v2.2.0
MarshalWriteAsMap writes map format encoded data to writer. This is the same thing that StructAsArray sets false.
func RemoveExtCoder ¶
RemoveExtCoder removes encoders for extension types.
func RemoveExtStreamCoder ¶ added in v2.2.0
func RemoveExtStreamCoder(e ext.StreamEncoder, d ext.StreamDecoder) error
RemoveExtStreamCoder removes stream encoders for extension types.
func SetComplexTypeCode ¶
func SetComplexTypeCode(code int8)
SetComplexTypeCode sets def.complexTypeCode
func SetDecodedTimeAsLocal ¶ added in v2.4.0
func SetDecodedTimeAsLocal()
SetDecodedTimeAsLocal sets decoded time.Time values to local timezone.
func SetDecodedTimeAsUTC ¶ added in v2.4.0
func SetDecodedTimeAsUTC()
SetDecodedTimeAsUTC sets decoded time.Time values to UTC timezone.
func Unmarshal ¶
Unmarshal analyzes the MessagePack-encoded data and stores the result into the pointer of v.
func UnmarshalAsArray ¶
UnmarshalAsArray decodes data that is encoded as array format. This is the same thing that StructAsArray sets true.
func UnmarshalAsMap ¶
UnmarshalAsMap decodes data that is encoded as map format. This is the same thing that StructAsArray sets false.
func UnmarshalRead ¶ added in v2.2.0
UnmarshalRead reads the MessagePack-encoded data from reader and stores the result into the pointer of v.
func UnmarshalReadAsArray ¶ added in v2.2.0
UnmarshalReadAsArray decodes from stream. stream data expects array format. This is the same thing that StructAsArray sets true.
func UnmarshalReadAsMap ¶ added in v2.2.0
UnmarshalReadAsMap decodes from stream. stream data expects map format. This is the same thing that StructAsArray sets false.
Types ¶
This section is empty.