prep_encoder.go 1.9 KB

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