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