Module: KRPC::ProtobufUtils::Encoder

Defined in:
lib/krpc/protobuf_utils.rb

Class Method Summary collapse

Class Method Details

.encode(value, type) ⇒ Object

Raises:

  • (RuntimeError)


67
68
69
70
71
# File 'lib/krpc/protobuf_utils.rb', line 67

def encode(value, type)
  meth_name = "encode_" + type
  raise(RuntimeError, "Unsupported type #{type}") unless respond_to?(meth_name)
  send(meth_name, value)
end

.encode_bool(value) ⇒ Object



111
112
113
# File 'lib/krpc/protobuf_utils.rb', line 111

def encode_bool(value)
  encode_varint(value ? 1 : 0)
end

.encode_bytes(value) ⇒ Object



119
120
121
122
# File 'lib/krpc/protobuf_utils.rb', line 119

def encode_bytes(value)
  size = encode_varint(value.size)
  size + value.map(&:chr).join.b
end

.encode_double(value) ⇒ Object



108
109
110
# File 'lib/krpc/protobuf_utils.rb', line 108

def encode_double(value)
  [value].pack('E')
end

.encode_float(value) ⇒ Object



105
106
107
# File 'lib/krpc/protobuf_utils.rb', line 105

def encode_float(value)
  [value].pack('e')
end

.encode_nonnegative_varint(value) ⇒ Object Also known as: encode_uint32, encode_uint64

Raises:

  • (RangeError)


87
88
89
90
# File 'lib/krpc/protobuf_utils.rb', line 87

def encode_nonnegative_varint(value)
  raise(RangeError, "Value must be non-negative, got #{value}") if value < 0
  encode_varint(value)
end

.encode_string(value) ⇒ Object



114
115
116
117
118
# File 'lib/krpc/protobuf_utils.rb', line 114

def encode_string(value)
  data = value.encode(Encoding::UTF_8).b
  size = encode_varint(data.bytesize)
  size + data
end

.encode_varint(value) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/krpc/protobuf_utils.rb', line 74

def encode_varint(value)
  return [value].pack('C') if value < 0b1000_0000
  result = ""
  loop do
    byte = value & 0b0111_1111
    value >>= 7
    if value == 0
      return result << byte.chr
    else
      result << (byte | 0b1000_0000).chr
    end
  end
end

.encode_zigzaged_varint_32(value) ⇒ Object Also known as: encode_sint32



91
92
93
94
# File 'lib/krpc/protobuf_utils.rb', line 91

def encode_zigzaged_varint_32(value)
  zigzaged = (value << 1) ^ (value >> 31)
  encode_varint(zigzaged)
end

.encode_zigzaged_varint_64(value) ⇒ Object Also known as: encode_sint64



95
96
97
98
# File 'lib/krpc/protobuf_utils.rb', line 95

def encode_zigzaged_varint_64(value)
  zigzaged = (value << 1) ^ (value >> 63)
  encode_varint(zigzaged)
end