class Protobuf::Field::MessageField

Public Instance Methods

acceptable?(val) click to toggle source

Public Instance Methods

# File lib/protobuf/field/message_field.rb, line 11
def acceptable?(val)
  unless val.is_a?(type_class) || val.respond_to?(:to_hash)
    fail TypeError, "Expected value of type '#{type_class}' for field #{name}, but got '#{val.class}'"
  end

  true
end
decode(bytes) click to toggle source
# File lib/protobuf/field/message_field.rb, line 19
def decode(bytes)
  type_class.decode(bytes)
end
encode(value) click to toggle source
# File lib/protobuf/field/message_field.rb, line 23
def encode(value)
  bytes = value.encode
  result = ::Protobuf::Field::VarintField.encode(bytes.size)
  result << bytes
end
message?() click to toggle source
# File lib/protobuf/field/message_field.rb, line 29
def message?
  true
end
wire_type() click to toggle source
# File lib/protobuf/field/message_field.rb, line 33
def wire_type
  ::Protobuf::WireType::LENGTH_DELIMITED
end

Private Instance Methods

define_setter() click to toggle source

Private Instance Methods

# File lib/protobuf/field/message_field.rb, line 43
def define_setter
  field = self
  message_class.class_eval do
    define_method("#{field.name}=") do |val|
      case
      when val.nil? then
        @values.delete(field.name)
      when val.is_a?(field.type_class) then
        @values[field.name] = val
      when val.respond_to?(:to_proto) then
        @values[field.name] = val.to_proto
      when val.respond_to?(:to_hash) then
        @values[field.name] = field.type_class.new(val.to_hash)
      else
        fail TypeError, "Expected value of type '#{field.type_class}' for field #{field.name}, but got '#{val.class}'"
      end
    end
  end
end