Class: Kafka::Protocol::Encoder
- Inherits:
-
Object
- Object
- Kafka::Protocol::Encoder
- Defined in:
- lib/kafka/protocol/encoder.rb
Overview
An encoder wraps an IO object, making it easy to write specific data types to it.
Class Method Summary collapse
-
.encode_with(object) ⇒ String
Encodes an object into a new buffer.
Instance Method Summary collapse
-
#initialize(io) ⇒ Encoder
constructor
Initializes a new encoder.
-
#write(bytes) ⇒ nil
Writes bytes directly to the IO object.
-
#write_array(array, &block) ⇒ nil
Writes an array to the IO object.
-
#write_boolean(boolean) ⇒ nil
Writes an 8-bit boolean to the IO object.
-
#write_bytes(bytes) ⇒ nil
Writes a byte string to the IO object.
-
#write_int16(int) ⇒ nil
Writes a 16-bit integer to the IO object.
-
#write_int32(int) ⇒ nil
Writes a 32-bit integer to the IO object.
-
#write_int64(int) ⇒ nil
Writes a 64-bit integer to the IO object.
-
#write_int8(int) ⇒ nil
Writes an 8-bit integer to the IO object.
-
#write_string(string) ⇒ nil
Writes a string to the IO object.
-
#write_varint(int) ⇒ nil
Writes an integer under varints serializing to the IO object.
-
#write_varint_array(array, &block) ⇒ nil
Writes an array to the IO object.
-
#write_varint_bytes(bytes) ⇒ nil
Writes a byte string to the IO object, the size is under varint format.
-
#write_varint_string(string) ⇒ nil
Writes a string to the IO object, the size is under varint format.
Constructor Details
#initialize(io) ⇒ Encoder
Initializes a new encoder.
Parameters:
-
io
(IO)
—
an object that acts as an IO.
13 14 15 16
# File 'lib/kafka/protocol/encoder.rb', line 13 def initialize(io) @io = io @io.set_encoding(Encoding::BINARY) end
Class Method Details
.encode_with(object) ⇒ String
Encodes an object into a new buffer.
Parameters:
-
object
(#encode)
—
the object that will encode itself.
Returns:
-
(String)
—
the encoded data.
174 175 176 177 178 179 180 181
# File 'lib/kafka/protocol/encoder.rb', line 174 def self.encode_with(object) buffer = StringIO.new encoder = new(buffer) object.encode(encoder) buffer.string end
Instance Method Details
#write(bytes) ⇒ nil
Writes bytes directly to the IO object.
Parameters:
- bytes (String)
Returns:
- (nil)
22 23 24 25 26
# File 'lib/kafka/protocol/encoder.rb', line 22 def write(bytes) @io.write(bytes) nil end
#write_array(array, &block) ⇒ nil
Writes an array to the IO object.
Each item in the specified array will be yielded to the provided block; it's the responsibility of the block to write those items using the encoder.
Parameters:
- array (Array)
Returns:
- (nil)
76 77 78 79 80 81 82 83 84
# File 'lib/kafka/protocol/encoder.rb', line 76 def write_array(array, &block) if array.nil? # An array can be null, which is different from it being empty. write_int32(-1) else write_int32(array.size) array.each(&block) end end
#write_boolean(boolean) ⇒ nil
Writes an 8-bit boolean to the IO object.
Parameters:
- boolean (Boolean)
Returns:
- (nil)
32 33 34
# File 'lib/kafka/protocol/encoder.rb', line 32 def write_boolean(boolean) boolean ? write_int8(1) : write_int8(0) end
#write_bytes(bytes) ⇒ nil
Writes a byte string to the IO object.
Parameters:
- bytes (String)
Returns:
- (nil)
148 149 150 151 152 153 154 155
# File 'lib/kafka/protocol/encoder.rb', line 148 def write_bytes(bytes) if bytes.nil? write_int32(-1) else write_int32(bytes.bytesize) write(bytes) end end
#write_int16(int) ⇒ nil
Writes a 16-bit integer to the IO object.
Parameters:
- int (Integer)
Returns:
- (nil)
48 49 50
# File 'lib/kafka/protocol/encoder.rb', line 48 def write_int16(int) write([int].pack("s>")) end
#write_int32(int) ⇒ nil
Writes a 32-bit integer to the IO object.
Parameters:
- int (Integer)
Returns:
- (nil)
56 57 58
# File 'lib/kafka/protocol/encoder.rb', line 56 def write_int32(int) write([int].pack("l>")) end
#write_int64(int) ⇒ nil
Writes a 64-bit integer to the IO object.
Parameters:
- int (Integer)
Returns:
- (nil)
64 65 66
# File 'lib/kafka/protocol/encoder.rb', line 64 def write_int64(int) write([int].pack("q>")) end
#write_int8(int) ⇒ nil
Writes an 8-bit integer to the IO object.
Parameters:
- int (Integer)
Returns:
- (nil)
40 41 42
# File 'lib/kafka/protocol/encoder.rb', line 40 def write_int8(int) write([int].pack("C")) end
#write_string(string) ⇒ nil
Writes a string to the IO object.
Parameters:
- string (String)
Returns:
- (nil)
104 105 106 107 108 109 110 111
# File 'lib/kafka/protocol/encoder.rb', line 104 def write_string(string) if string.nil? write_int16(-1) else write_int16(string.bytesize) write(string) end end
#write_varint(int) ⇒ nil
Writes an integer under varints serializing to the IO object. https://developers.google.com/protocol-buffers/docs/encoding#varints
Parameters:
- int (Integer)
Returns:
- (nil)
131 132 133 134 135 136 137 138 139 140 141 142
# File 'lib/kafka/protocol/encoder.rb', line 131 def write_varint(int) int = int << 1 int = ~int | 1 if int < 0 chunks = [] while int >> 7 != 0 chunks << (int & 0x7f | 0x80) int >>= 7 end chunks << int write(chunks.pack("C*")) end
#write_varint_array(array, &block) ⇒ nil
Writes an array to the IO object. Just like #write_array, unless the size is under varint format
Parameters:
- array (Array)
Returns:
- (nil)
91 92 93 94 95 96 97 98
# File 'lib/kafka/protocol/encoder.rb', line 91 def write_varint_array(array, &block) if array.nil? write_varint(-1) else write_varint(array.size) array.each(&block) end end
#write_varint_bytes(bytes) ⇒ nil
Writes a byte string to the IO object, the size is under varint format
Parameters:
- bytes (String)
Returns:
- (nil)
161 162 163 164 165 166 167 168
# File 'lib/kafka/protocol/encoder.rb', line 161 def write_varint_bytes(bytes) if bytes.nil? write_varint(-1) else write_varint(bytes.bytesize) write(bytes) end end
#write_varint_string(string) ⇒ nil
Writes a string to the IO object, the size is under varint format
Parameters:
- string (String)
Returns:
- (nil)
117 118 119 120 121 122 123 124
# File 'lib/kafka/protocol/encoder.rb', line 117 def write_varint_string(string) if string.nil? write_varint(-1) else write_varint(string.bytesize) write(string) end end