121 lines
2.1 KiB
Go
121 lines
2.1 KiB
Go
package sarama
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
|
|
"github.com/rcrowley/go-metrics"
|
|
)
|
|
|
|
type prepEncoder struct {
|
|
length int
|
|
}
|
|
|
|
// primitives
|
|
|
|
func (pe *prepEncoder) putInt8(in int8) {
|
|
pe.length++
|
|
}
|
|
|
|
func (pe *prepEncoder) putInt16(in int16) {
|
|
pe.length += 2
|
|
}
|
|
|
|
func (pe *prepEncoder) putInt32(in int32) {
|
|
pe.length += 4
|
|
}
|
|
|
|
func (pe *prepEncoder) putInt64(in int64) {
|
|
pe.length += 8
|
|
}
|
|
|
|
func (pe *prepEncoder) putArrayLength(in int) error {
|
|
if in > math.MaxInt32 {
|
|
return PacketEncodingError{fmt.Sprintf("array too long (%d)", in)}
|
|
}
|
|
pe.length += 4
|
|
return nil
|
|
}
|
|
|
|
// arrays
|
|
|
|
func (pe *prepEncoder) putBytes(in []byte) error {
|
|
pe.length += 4
|
|
if in == nil {
|
|
return nil
|
|
}
|
|
if len(in) > math.MaxInt32 {
|
|
return PacketEncodingError{fmt.Sprintf("byteslice too long (%d)", len(in))}
|
|
}
|
|
pe.length += len(in)
|
|
return nil
|
|
}
|
|
|
|
func (pe *prepEncoder) putRawBytes(in []byte) error {
|
|
if len(in) > math.MaxInt32 {
|
|
return PacketEncodingError{fmt.Sprintf("byteslice too long (%d)", len(in))}
|
|
}
|
|
pe.length += len(in)
|
|
return nil
|
|
}
|
|
|
|
func (pe *prepEncoder) putString(in string) error {
|
|
pe.length += 2
|
|
if len(in) > math.MaxInt16 {
|
|
return PacketEncodingError{fmt.Sprintf("string too long (%d)", len(in))}
|
|
}
|
|
pe.length += len(in)
|
|
return nil
|
|
}
|
|
|
|
func (pe *prepEncoder) putStringArray(in []string) error {
|
|
err := pe.putArrayLength(len(in))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, str := range in {
|
|
if err := pe.putString(str); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (pe *prepEncoder) putInt32Array(in []int32) error {
|
|
err := pe.putArrayLength(len(in))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pe.length += 4 * len(in)
|
|
return nil
|
|
}
|
|
|
|
func (pe *prepEncoder) putInt64Array(in []int64) error {
|
|
err := pe.putArrayLength(len(in))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pe.length += 8 * len(in)
|
|
return nil
|
|
}
|
|
|
|
func (pe *prepEncoder) offset() int {
|
|
return pe.length
|
|
}
|
|
|
|
// stackable
|
|
|
|
func (pe *prepEncoder) push(in pushEncoder) {
|
|
pe.length += in.reserveLength()
|
|
}
|
|
|
|
func (pe *prepEncoder) pop() error {
|
|
return nil
|
|
}
|
|
|
|
// we do not record metrics during the prep encoder pass
|
|
func (pe *prepEncoder) metricRegistry() metrics.Registry {
|
|
return nil
|
|
}
|