module Bones::RPC::Protocol::AdapterHelper::ClassMethods

Provides a DSL for defining struct-like fields for building messages for the Mongo Wire.

@example

class Command
  extend Message::ClassMethods

  int32 :length
end

Command.fields # => [:length]
command = Command.new
command.length = 12
command.serialize_length("") # => "\f\x00\x00\x00"

Public Instance Methods

any(name) click to toggle source
# File lib/bones/rpc/protocol/adapter_helper.rb, line 76
          def any(name)
            attr_accessor name

            class_eval <<-RUBY, __FILE__, __LINE__ + 1
              def process_#{name}
                #{name}
              end
            RUBY

            fields << name
          end
binary(name) click to toggle source

Declare a binary field.

@example

class Query < Message
  binary :collection
end

@param [String] name the name of this field

# File lib/bones/rpc/protocol/adapter_helper.rb, line 96
          def binary(name)
            attr_accessor name

            class_eval <<-RUBY, __FILE__, __LINE__ + 1
              def process_#{name}
                #{name}
              end
            RUBY

            fields << name
          end
deserialize(adapter, buffer="") click to toggle source
# File lib/bones/rpc/protocol/adapter_helper.rb, line 64
def deserialize(adapter, buffer="")
  adapter = Adapter.get(adapter)
  message = adapter.deserialize(buffer)
  message.shift
  new(adapter, *message)
end
fields() click to toggle source

@return [Array] the fields defined for this message

# File lib/bones/rpc/protocol/adapter_helper.rb, line 72
def fields
  @fields ||= []
end
finalize() click to toggle source

Declares the message class as complete, and defines its serialization method from the declared fields.

# File lib/bones/rpc/protocol/adapter_helper.rb, line 142
          def finalize
            class_eval <<-EOS, __FILE__, __LINE__ + 1
              def process
                list = []
                #{fields.map { |f| "list << process_#{f}" }.join("\n")}
                list
              end
            EOS
          end
integer(name) click to toggle source
# File lib/bones/rpc/protocol/adapter_helper.rb, line 108
          def integer(name)
            attr_accessor name

            class_eval <<-RUBY, __FILE__, __LINE__ + 1
              def #{name}
                @#{name} ||= 0
              end

              def process_#{name}
                #{name}
              end
            RUBY

            fields << name
          end
list(name) click to toggle source
# File lib/bones/rpc/protocol/adapter_helper.rb, line 124
          def list(name)
            attr_accessor name

            class_eval <<-RUBY, __FILE__, __LINE__ + 1
              def #{name}
                @#{name} ||= []
              end

              def process_#{name}
                #{name}
              end
            RUBY

            fields << name
          end

Private Instance Methods

inherited(subclass) click to toggle source

This ensures that subclasses of the primary wire message classes have identical fields.

Calls superclass method
# File lib/bones/rpc/protocol/adapter_helper.rb, line 156
def inherited(subclass)
  super
  subclass.fields.replace(fields)
end