class Protobuf::Encoder

Attributes

message[RW]
stream[RW]

Public Class Methods

encode(stream, message) click to toggle source
# File lib/protobuf/encoder.rb, line 4
def self.encode(stream, message)
  new(stream, message).encode
end
new(message, stream) click to toggle source
# File lib/protobuf/encoder.rb, line 16
def initialize(message, stream)
  unless message.respond_to?(:each_field_for_serialization)
    fail ArgumentError, "Message instance must respond to :each_field_for_serialization"
  end

  self.message = message
  self.stream = stream
end

Public Instance Methods

encode() click to toggle source
# File lib/protobuf/encoder.rb, line 25
def encode
  message.each_field_for_serialization do |field, value|
    encode_field(field, value)
  end

  stream
end

Private Instance Methods

encode_field(field, value) click to toggle source
# File lib/protobuf/encoder.rb, line 35
def encode_field(field, value)
  if field.repeated?
    encode_repeated_field(field, value)
  else
    write_pair(field, value)
  end
end
encode_packed_field(field, value) click to toggle source
# File lib/protobuf/encoder.rb, line 43
def encode_packed_field(field, value)
  key = (field.tag << 3) | ::Protobuf::WireType::LENGTH_DELIMITED
  packed_value = value.map { |val| field.encode(val) }.join
  stream << ::Protobuf::Field::VarintField.encode(key)
  stream << ::Protobuf::Field::VarintField.encode(packed_value.size)
  stream << packed_value
end
encode_repeated_field(field, value) click to toggle source
# File lib/protobuf/encoder.rb, line 51
def encode_repeated_field(field, value)
  if field.packed?
    encode_packed_field(field, value)
  else
    value.each { |val| write_pair(field, val) }
  end
end
write_pair(field, value) click to toggle source

Encode key and value, and write to stream.

# File lib/protobuf/encoder.rb, line 60
def write_pair(field, value)
  key = (field.tag << 3) | field.wire_type
  stream << ::Protobuf::Field::VarintField.encode(key)
  stream << field.encode(value)
end