Sha256: 7a58999016b6ce47436ea24e9eb3b0a7f905e199ff9324469a974126e223197c

Contents?: true

Size: 1.18 KB

Versions: 9

Compression:

Stored size: 1.18 KB

Contents

require 'protobuf/field/base_field'

module Protobuf
  module Field
    class MessageField < BaseField
      ##
      # Public Instance Methods
      #
      def acceptable?(val)
        raise TypeError unless val.instance_of?(type) || val.instance_of?(Hash)
        true
      end

      def decode(bytes)
        message = type.new
        message.parse_from_string(bytes)
        message
      end
      
      def encode(value)
        bytes = value.serialize_to_string
        result = VarintField.encode(bytes.size)
        result << bytes
      end

      def wire_type
        ::Protobuf::WireType::LENGTH_DELIMITED
      end

      private

      def define_setter
        field = self
        @message_class.class_eval do
          define_method("#{field.name}=") do |val|
            case val
            when nil then
              @values.delete(field.name)
            when Hash then
              @values[field.name] = field.type.new(val)
            when field.type then
              @values[field.name] = val
            else
              raise TypeError, "Expected value of type '#{field.type}', but got '#{val.class}'"
            end
          end
        end
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
protobuf-2.0.2 lib/protobuf/field/message_field.rb
protobuf-2.0.1 lib/protobuf/field/message_field.rb
protobuf-2.0.0 lib/protobuf/field/message_field.rb
protobuf-2.0.0.rc6 lib/protobuf/field/message_field.rb
protobuf-2.0.0.rc5 lib/protobuf/field/message_field.rb
protobuf-2.0.0.rc4 lib/protobuf/field/message_field.rb
protobuf-2.0.0.rc3 lib/protobuf/field/message_field.rb
protobuf-2.0.0.rc2 lib/protobuf/field/message_field.rb
protobuf-2.0.0.rc1 lib/protobuf/field/message_field.rb