Class: Kafka::Protocol::Decoder

Inherits:
Object
  • Object
show all
Defined in:
lib/kafka/protocol/decoder.rb

Overview

A decoder wraps an IO object, making it easy to read specific data types from it. The Kafka protocol is not self-describing, so a client must call these methods in just the right order for things to work.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(io) ⇒ Decoder

Initializes a new decoder.

Parameters:

  • io (IO)

    an object that acts as an IO.



15
16
17
# File 'lib/kafka/protocol/decoder.rb', line 15

def initialize(io)
  @io = io
end

Class Method Details

.from_string(str) ⇒ Object



8
9
10
# File 'lib/kafka/protocol/decoder.rb', line 8

def self.from_string(str)
  new(StringIO.new(str))
end

Instance Method Details

#array(&block) ⇒ Array

Decodes an array from the IO object.

The provided block will be called once for each item in the array. It is the responsibility of the block to decode the proper type in the block, since there's no information that allows the type to be inferred automatically.

Returns:

  • (Array)


66
67
68
69
# File 'lib/kafka/protocol/decoder.rb', line 66

def array(&block)
  size = int32
  size.times.map(&block)
end

#booleanBoolean

Decodes an 8-bit boolean from the IO object.

Returns:

  • (Boolean)


26
27
28
# File 'lib/kafka/protocol/decoder.rb', line 26

def boolean
  read(1) == 0x1
end

#bytesString

Decodes a list of bytes from the IO object.

Returns:

  • (String)


87
88
89
90
91
92
93
94
95
# File 'lib/kafka/protocol/decoder.rb', line 87

def bytes
  size = int32

  if size == -1
    nil
  else
    read(size)
  end
end

#eof?Boolean

Returns:

  • (Boolean)


19
20
21
# File 'lib/kafka/protocol/decoder.rb', line 19

def eof?
  @io.eof?
end

#int16Integer

Decodes a 16-bit integer from the IO object.

Returns:

  • (Integer)


40
41
42
# File 'lib/kafka/protocol/decoder.rb', line 40

def int16
  read(2).unpack("s>").first
end

#int32Integer

Decodes a 32-bit integer from the IO object.

Returns:

  • (Integer)


47
48
49
# File 'lib/kafka/protocol/decoder.rb', line 47

def int32
  read(4).unpack("l>").first
end

#int64Integer

Decodes a 64-bit integer from the IO object.

Returns:

  • (Integer)


54
55
56
# File 'lib/kafka/protocol/decoder.rb', line 54

def int64
  read(8).unpack("q>").first
end

#int8Integer

Decodes an 8-bit integer from the IO object.

Returns:

  • (Integer)


33
34
35
# File 'lib/kafka/protocol/decoder.rb', line 33

def int8
  read(1).unpack("C").first
end

#read(number_of_bytes) ⇒ String

Reads the specified number of bytes from the IO object, returning them as a String.

Returns:

  • (String)

Raises:

  • (EOFError)


101
102
103
104
105
106
107
108
109
110
111
# File 'lib/kafka/protocol/decoder.rb', line 101

def read(number_of_bytes)
  return "" if number_of_bytes == 0

  data = @io.read(number_of_bytes) or raise EOFError

  # If the `read` call returned less data than expected we should not
  # proceed.
  raise EOFError if data.size != number_of_bytes

  data
end

#stringString

Decodes a string from the IO object.

Returns:

  • (String)


74
75
76
77
78
79
80
81
82
# File 'lib/kafka/protocol/decoder.rb', line 74

def string
  size = int16

  if size == -1
    nil
  else
    read(size)
  end
end