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  }