module IB::Messages
Constants
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