blob: 7ce3bc0f6e27ae0cf5eab71e2d67c161b442c0a4 [file] [log] [blame]
khenaidooac637102019-01-14 15:44:34 -05001package sarama
2
3import (
4 "fmt"
5
6 "github.com/rcrowley/go-metrics"
7)
8
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.
11type encoder interface {
12 encode(pe packetEncoder) error
13}
14
15// Encode takes an Encoder and turns it into bytes while potentially recording metrics.
16func encode(e encoder, metricRegistry metrics.Registry) ([]byte, error) {
17 if e == nil {
18 return nil, nil
19 }
20
21 var prepEnc prepEncoder
22 var realEnc realEncoder
23
24 err := e.encode(&prepEnc)
25 if err != nil {
26 return nil, err
27 }
28
29 if prepEnc.length < 0 || prepEnc.length > int(MaxRequestSize) {
30 return nil, PacketEncodingError{fmt.Sprintf("invalid request size (%d)", prepEnc.length)}
31 }
32
33 realEnc.raw = make([]byte, prepEnc.length)
34 realEnc.registry = metricRegistry
35 err = e.encode(&realEnc)
36 if err != nil {
37 return nil, err
38 }
39
40 return realEnc.raw, nil
41}
42
43// Decoder is the interface that wraps the basic Decode method.
44// Anything implementing Decoder can be extracted from bytes using Kafka's encoding rules.
45type decoder interface {
46 decode(pd packetDecoder) error
47}
48
49type versionedDecoder interface {
50 decode(pd packetDecoder, version int16) error
51}
52
53// Decode takes bytes and a Decoder and fills the fields of the decoder from the bytes,
54// interpreted using Kafka's encoding rules.
55func decode(buf []byte, in decoder) error {
56 if buf == nil {
57 return nil
58 }
59
60 helper := realDecoder{raw: buf}
61 err := in.decode(&helper)
62 if err != nil {
63 return err
64 }
65
66 if helper.off != len(buf) {
67 return PacketDecodingError{"invalid length"}
68 }
69
70 return nil
71}
72
73func versionedDecode(buf []byte, in versionedDecoder, version int16) error {
74 if buf == nil {
75 return nil
76 }
77
78 helper := realDecoder{raw: buf}
79 err := in.decode(&helper, version)
80 if err != nil {
81 return err
82 }
83
84 if helper.off != len(buf) {
85 return PacketDecodingError{"invalid length"}
86 }
87
88 return nil
89}