class FixProtocolTools::MessagesProcessor

Constants

MESSAGE_DELIMITER

Public Class Methods

new(options) click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 10
def initialize(options)
  @spec = nil
  @is_even_line = true
  @output = STDOUT
  @grep = options[:grep]
  @highlights = options[:highlights] || []
  @heartbeats = options[:heartbeats]

  if options[:dictionary]
    @spec = Specification::Dictionary.new(Specification::Reader.read_file(options[:dictionary]))
  end
end

Public Instance Methods

process() click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 23
def process()
  buffer = nil

  ARGF.each do |line|
    line = line.gsub(/\r/, '').chomp
    if buffer
      buffer += line
      if buffer =~ /8=FIX.*[A\x01]10=\d+/
        process_line(buffer)
        buffer = nil
      end
    else
      if line =~ /8=FIX/ && !(line =~ /[A\x01]10=\d+/)
        buffer = line
      else
        process_line(line)
      end
    end
  end

  process_line(buffer) if buffer
end

Private Instance Methods

fix_message_fields(line) click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 111
def fix_message_fields(line)
  start_index = line.index("8=FIX")
  end_index = line.rindex(MESSAGE_DELIMITER)

  if start_index && end_index
    line[start_index ... end_index].split(MESSAGE_DELIMITER).map do |pair|
      pair.strip.split '='
    end
  else
    nil
  end
end
formatted_row(field_id, value_id, field_name, value_name, field_name_padding) click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 94
def formatted_row(field_id, value_id, field_name, value_name, field_name_padding)
  row = field_name + '  =  '.rjust(field_name_padding) + value_name +
      '  '.rjust(35 - value_name.length) +
      field_id + '=' + value_id

  if @highlights and @highlights.include?(field_name)
    yellow(row)
  else
    row
  end
end
print_row(line) click to toggle source
process_line(line) click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 53
def process_line(line)
  fields = fix_message_fields(line.gsub('^A', MESSAGE_DELIMITER))
  return unless fields

  @spec ||= resolve_specification(fields)
  rows = []
  show_message = @grep.nil?
  message_name = 'Undefined'
  sender = 'Undefined'
  target = 'Undefined'

  fields.each do |field_id, value_id|
    field_name = @spec.field_name(field_id) || field_id
    field_name_padding = @spec.max_field_length - field_name.length - 2
    value_name = if @spec.message_type?(field_id)
                   message_name = @spec.message_type(value_id)
                 else
                   @spec.enum_value(field_id, value_id)
                 end
    sender = value_name if @spec.sender? field_id
    target = value_name if @spec.target? field_id

    if @grep && (value_name.include?(@grep) || value_id.include?(@grep))
      value_name = red(value_name)
      show_message = true
    end

    show_message = false if !@heartbeats && @spec.heartbeat?(field_id, value_id)

    rows << formatted_row(field_id, value_id, field_name, value_name, field_name_padding)
  end

  if show_message
    @is_even_line = false
    @output.puts ''
    @output.puts("[#{red(message_name + " #{sender} >>> #{target}")}]" +
                     yellow(" =-=-=-=-=-=-==-=-=-=-=-=-==-=-=-=-=-=-=        "))
    rows.each { |row| print_row(row) }
  end
end
resolve_specification(fields) click to toggle source
# File lib/fix_protocol_tools/messages_processor.rb, line 106
def resolve_specification(fields)
  fix_version = fields[0].last
  Specification::Dictionary.new(Specification::Reader.read_defaults(fix_version))
end