From b85c94bfc9b040e255f51fb7413203e605653fe4 Mon Sep 17 00:00:00 2001 From: ston1th Date: Sat, 14 Nov 2020 17:52:03 +0100 Subject: [PATCH] added encoder and decoder --- msgpack/msgpack.go | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/msgpack/msgpack.go b/msgpack/msgpack.go index cc4e953..405e925 100644 --- a/msgpack/msgpack.go +++ b/msgpack/msgpack.go @@ -2,6 +2,7 @@ package msgpack import ( "bytes" + "io" "sync" "github.com/hashicorp/go-msgpack/codec" @@ -15,31 +16,39 @@ var rdrPool = sync.Pool{ New: func() interface{} { return new(bytes.Reader) }, } -type encoder struct{} - -var MsgPack = encoder{} - -func (encoder) Unmarshal(b []byte, v interface{}) error { - rdr := rdrPool.Get().(*bytes.Reader) - rdr.Reset(b) - defer rdrPool.Put(rdr) - return codec.NewDecoder(rdr, &codec.MsgpackHandle{}).Decode(v) +func NewEncoder(w io.Writer) *codec.Encoder { + return codec.NewEncoder(w, &codec.MsgpackHandle{}) } -func (encoder) Marshal(v interface{}) ([]byte, error) { +func NewDecoder(r io.Reader) *codec.Decoder { + return codec.NewDecoder(r, &codec.MsgpackHandle{}) +} + +type msgPackEncoder struct{} + +var MsgPack = msgPackEncoder{} + +func (msgPackEncoder) Marshal(v interface{}) ([]byte, error) { buf := bufPool.Get().(*bytes.Buffer) buf.Reset() - if err := codec.NewEncoder(buf, &codec.MsgpackHandle{}).Encode(v); err != nil { + if err := NewEncoder(buf).Encode(v); err != nil { bufPool.Put(buf) return nil, err } return buf.Bytes(), nil } -func Unmarshal(b []byte, v interface{}) error { - return MsgPack.Unmarshal(b, v) +func (msgPackEncoder) Unmarshal(b []byte, v interface{}) error { + rdr := rdrPool.Get().(*bytes.Reader) + rdr.Reset(b) + defer rdrPool.Put(rdr) + return NewDecoder(rdr).Decode(v) } func Marshal(v interface{}) ([]byte, error) { return MsgPack.Marshal(v) } + +func Unmarshal(b []byte, v interface{}) error { + return MsgPack.Unmarshal(b, v) +}