prep_encoder.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package sarama
  2. import (
  3. "encoding/binary"
  4. "fmt"
  5. "math"
  6. )
  7. type prepEncoder struct {
  8. length int
  9. }
  10. // primitives
  11. func (pe *prepEncoder) putInt8(in int8) {
  12. pe.length += binary.Size(in)
  13. }
  14. func (pe *prepEncoder) putInt16(in int16) {
  15. pe.length += binary.Size(in)
  16. }
  17. func (pe *prepEncoder) putInt32(in int32) {
  18. pe.length += binary.Size(in)
  19. }
  20. func (pe *prepEncoder) putInt64(in int64) {
  21. pe.length += binary.Size(in)
  22. }
  23. func (pe *prepEncoder) putArrayLength(in int) error {
  24. if in > math.MaxInt32 {
  25. return PacketEncodingError{fmt.Sprintf("Array too long: %d", in)}
  26. }
  27. pe.length += 4
  28. return nil
  29. }
  30. // arrays
  31. func (pe *prepEncoder) putBytes(in []byte) error {
  32. pe.length += 4
  33. if in == nil {
  34. return nil
  35. }
  36. if len(in) > math.MaxInt32 {
  37. return PacketEncodingError{fmt.Sprintf("Byteslice too long: %d", len(in))}
  38. }
  39. pe.length += len(in)
  40. return nil
  41. }
  42. func (pe *prepEncoder) putRawBytes(in []byte) error {
  43. if len(in) > math.MaxInt32 {
  44. return PacketEncodingError{fmt.Sprintf("Byteslice too long: %d", len(in))}
  45. }
  46. pe.length += len(in)
  47. return nil
  48. }
  49. func (pe *prepEncoder) putString(in string) error {
  50. pe.length += 2
  51. if len(in) > math.MaxInt16 {
  52. return PacketEncodingError{fmt.Sprintf("String too long: %d", len(in))}
  53. }
  54. pe.length += len(in)
  55. return nil
  56. }
  57. func (pe *prepEncoder) putInt32Array(in []int32) error {
  58. err := pe.putArrayLength(len(in))
  59. if err != nil {
  60. return err
  61. }
  62. pe.length += 4 * len(in)
  63. return nil
  64. }
  65. func (pe *prepEncoder) putInt64Array(in []int64) error {
  66. err := pe.putArrayLength(len(in))
  67. if err != nil {
  68. return err
  69. }
  70. pe.length += 8 * len(in)
  71. return nil
  72. }
  73. // stackable
  74. func (pe *prepEncoder) push(in pushEncoder) {
  75. pe.length += in.reserveLength()
  76. }
  77. func (pe *prepEncoder) pop() error {
  78. return nil
  79. }