module IB::Messages

Constants

CLIENT_VERSION

This gem supports incoming/outgoing IB messages compatible with the following IB client/server versions:

SERVER_VERSION

Public Instance Methods

def_message(message_id_version, *data_map, &to_human) click to toggle source

Macro that defines short message classes using a one-liner.

First arg is either a [message_id, version] pair or just message_id (version 1)
data_map contains instructions for processing @data Hash. Format:
   Incoming messages: [field, type] or [group, field, type]
   Outgoing messages: field, [field, default] or [field, method, [args]]
# File lib/ib/messages/abstract_message.rb, line 59
def def_message message_id_version, *data_map, &to_human
  base = data_map.first.is_a?(Class) ? data_map.shift : self::AbstractMessage
  message_id, version = message_id_version

  # Define new message class
  message_class = Class.new(base) do
    @message_id, @version = message_id, version || 1
    @data_map = data_map

    @data_map.each do |(name, _, type_args)|
      # Avoid redefining existing accessor methods
      unless instance_methods.include?(name.to_s) || instance_methods.include?(name.to_sym)
        if type_args.is_a?(Symbol) # This is Incoming with [group, field, type]
          attr_reader name
        else
          define_method(name) { @data[name] } 
        end
      end
    end

    define_method(:to_human, &to_human) if to_human
  end

  # Add defined message class to Classes Hash keyed by its message_id
  self::Classes[message_id] = message_class

  message_class
end