| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- /*
- Package encoding provides an API for dealing with data that is encoded using Kafka's
- encoding rules.
- Kafka uses a custom set of encoding rules for arrays, strings, and other non-trivial data structures.
- This package implements encoders and decoders for Go types in this format, as well as broader helper
- functions for encoding entire structs a field at a time.
- */
- package encoding
- // Encoder is the interface that wraps the basic Encode method.
- // Anything implementing Encoder can be turned into bytes using Kafka's encoding rules.
- type Encoder interface {
- Encode(pe PacketEncoder) error
- }
- // Encode takes an Encoder and turns it into bytes.
- func Encode(in Encoder) ([]byte, error) {
- if in == nil {
- return nil, nil
- }
- var prepEnc prepEncoder
- var realEnc realEncoder
- err := in.Encode(&prepEnc)
- if err != nil {
- return nil, err
- }
- realEnc.raw = make([]byte, prepEnc.length)
- err = in.Encode(&realEnc)
- if err != nil {
- return nil, err
- }
- return realEnc.raw, nil
- }
- // Decoder is the interface that wraps the basic Decode method.
- // Anything implementing Decoder can be extracted from bytes using Kafka's encoding rules.
- type Decoder interface {
- Decode(pd PacketDecoder) error
- }
- // Decode takes bytes and a Decoder and fills the fields of the decoder from the bytes,
- // interpreted using Kafka's encoding rules.
- func Decode(buf []byte, in Decoder) error {
- if buf == nil {
- return nil
- }
- helper := realDecoder{raw: buf}
- err := in.Decode(&helper)
- if err != nil {
- return err
- }
- if helper.off != len(buf) {
- return DecodingError
- }
- return nil
- }
|