github.com/algorand/go-algorand-sdk@v1.24.0/encoding/msgpack/msgpack.go (about) 1 package msgpack 2 3 import ( 4 "io" 5 6 "github.com/algorand/go-codec/codec" 7 ) 8 9 // CodecHandle is used to instantiate msgpack encoders and decoders 10 // with our settings (canonical, paranoid about decoding errors) 11 var CodecHandle *codec.MsgpackHandle 12 13 // LenientCodecHandle is used to instantiate msgpack encoders for the REST API. 14 var LenientCodecHandle *codec.MsgpackHandle 15 16 // init configures our msgpack encoder and decoder 17 func init() { 18 CodecHandle = new(codec.MsgpackHandle) 19 CodecHandle.ErrorIfNoField = true 20 CodecHandle.ErrorIfNoArrayExpand = true 21 CodecHandle.Canonical = true 22 CodecHandle.RecursiveEmptyCheck = true 23 CodecHandle.WriteExt = true 24 CodecHandle.PositiveIntUnsigned = true 25 26 LenientCodecHandle = new(codec.MsgpackHandle) 27 // allow unknown fields to ensure forward compatibility. 28 LenientCodecHandle.ErrorIfNoField = false 29 LenientCodecHandle.ErrorIfNoArrayExpand = true 30 LenientCodecHandle.Canonical = true 31 LenientCodecHandle.RecursiveEmptyCheck = true 32 LenientCodecHandle.WriteExt = true 33 LenientCodecHandle.PositiveIntUnsigned = true 34 } 35 36 // Encode returns a msgpack-encoded byte buffer for a given object 37 func Encode(obj interface{}) []byte { 38 var b []byte 39 enc := codec.NewEncoderBytes(&b, CodecHandle) 40 enc.MustEncode(obj) 41 return b 42 } 43 44 // Decode attempts to decode a msgpack-encoded byte buffer into an 45 // object instance pointed to by objptr 46 func Decode(b []byte, objptr interface{}) error { 47 dec := codec.NewDecoderBytes(b, CodecHandle) 48 err := dec.Decode(objptr) 49 if err != nil { 50 return err 51 } 52 return nil 53 } 54 55 // NewDecoder returns a msgpack decoder 56 func NewDecoder(r io.Reader) *codec.Decoder { 57 return codec.NewDecoder(r, CodecHandle) 58 } 59 60 // NewLenientDecoder returns a msgpack decoder 61 func NewLenientDecoder(r io.Reader) *codec.Decoder { 62 return codec.NewDecoder(r, LenientCodecHandle) 63 }