Module: IB::Messages

Defined in:
lib/ib-ruby/messages.rb,
lib/ib-ruby/messages/abstract_message.rb,
lib/ib-ruby/messages/incoming/open_order.rb

Defined Under Namespace

Modules: Incoming Classes: AbstractMessage

Instance Method Summary collapse

Instance Method Details

#def_message(message_id_version, *data_map, &to_human) ⇒ Object

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]]


67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/ib-ruby/messages/abstract_message.rb', line 67

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)|
      if type_args.is_a?(Symbol) # This is Incoming with [group, field, type]
        attr_reader name
      else
        define_method(name) { @data[name] }
      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