encoder_decoder.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. Package encoding provides an API for dealing with data that is encoded using Kafka's
  3. encoding rules.
  4. Kafka uses a custom set of encoding rules for arrays, strings, and other non-trivial data structures.
  5. This package implements encoders and decoders for Go types in this format, as well as broader helper
  6. functions for encoding entire structs a field at a time.
  7. */
  8. package encoding
  9. // Encoder is the interface that wraps the basic Encode method.
  10. // Anything implementing Encoder can be turned into bytes using Kafka's encoding rules.
  11. type Encoder interface {
  12. Encode(pe PacketEncoder) error
  13. }
  14. // Encode takes an Encoder and turns it into bytes.
  15. func Encode(in Encoder) ([]byte, error) {
  16. if in == nil {
  17. return nil, nil
  18. }
  19. var prepEnc prepEncoder
  20. var realEnc realEncoder
  21. err := in.Encode(&prepEnc)
  22. if err != nil {
  23. return nil, err
  24. }
  25. realEnc.raw = make([]byte, prepEnc.length)
  26. err = in.Encode(&realEnc)
  27. if err != nil {
  28. return nil, err
  29. }
  30. return realEnc.raw, nil
  31. }
  32. // Decoder is the interface that wraps the basic Decode method.
  33. // Anything implementing Decoder can be extracted from bytes using Kafka's encoding rules.
  34. type Decoder interface {
  35. Decode(pd PacketDecoder) error
  36. }
  37. // Decode takes bytes and a Decoder and fills the fields of the decoder from the bytes,
  38. // interpreted using Kafka's encoding rules.
  39. func Decode(buf []byte, in Decoder) error {
  40. if buf == nil {
  41. return nil
  42. }
  43. helper := realDecoder{raw: buf}
  44. err := in.Decode(&helper)
  45. if err != nil {
  46. return err
  47. }
  48. if helper.off != len(buf) {
  49. return DecodingError
  50. }
  51. return nil
  52. }