encoder_decoder.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package sarama
  2. // Encoder is the interface that wraps the basic Encode method.
  3. // Anything implementing Encoder can be turned into bytes using Kafka's encoding rules.
  4. type encoder interface {
  5. encode(pe packetEncoder) error
  6. }
  7. // Encode takes an Encoder and turns it into bytes.
  8. func encode(in encoder) ([]byte, error) {
  9. if in == nil {
  10. return nil, nil
  11. }
  12. var prepEnc prepEncoder
  13. var realEnc realEncoder
  14. err := in.encode(&prepEnc)
  15. if err != nil {
  16. return nil, err
  17. }
  18. if prepEnc.length < 0 || uint32(prepEnc.length) > MaxRequestSize {
  19. return nil, EncodingError
  20. }
  21. realEnc.raw = make([]byte, prepEnc.length)
  22. err = in.encode(&realEnc)
  23. if err != nil {
  24. return nil, err
  25. }
  26. return realEnc.raw, nil
  27. }
  28. // Decoder is the interface that wraps the basic Decode method.
  29. // Anything implementing Decoder can be extracted from bytes using Kafka's encoding rules.
  30. type decoder interface {
  31. decode(pd packetDecoder) error
  32. }
  33. // Decode takes bytes and a Decoder and fills the fields of the decoder from the bytes,
  34. // interpreted using Kafka's encoding rules.
  35. func decode(buf []byte, in decoder) error {
  36. if buf == nil {
  37. return nil
  38. }
  39. helper := realDecoder{raw: buf}
  40. err := in.decode(&helper)
  41. if err != nil {
  42. return err
  43. }
  44. if helper.off != len(buf) {
  45. return DecodingError{Info: "Length was invalid"}
  46. }
  47. return nil
  48. }