class TelosLWCP::Command::Incoming

Attributes

arguments[RW]
command[RW]
object[RW]
system_items[RW]

Public Class Methods

new(string) click to toggle source
# File lib/telos_lwcp/command.rb, line 34
def initialize(string)
  parts = string.match(/\A(?<command>\S+) (?<object>\S+) (?<arguments>.*)\Z/)
  self.command = parts[:command]
  self.object = parts[:object]
  self.arguments = {}
  self.system_items = {}

  parse_extra_arguments parts[:arguments]
end

Private Instance Methods

parse_extra_arguments(raw_string) click to toggle source
# File lib/telos_lwcp/command.rb, line 45
def parse_extra_arguments(raw_string)
  buffer = ""
  in_string = false
  key = nil
  array = nil
  array_stack = []

  # Translate stuff like
  (raw_string + ' ').each_char do |char|
    case char
    when '='              # Assigning something, so everything before this is the key
      key = buffer
      buffer = ""
    when '"'              # Toggle in-string status
      in_string = !in_string
      buffer << char
    when /\[/
      arr = []
      array_stack.any? ? array_stack.last << arr : array = arr
      array_stack << arr
    when /\]/
      if !buffer.empty?
        array_stack.last << raw_string_to_type(buffer)
        buffer = ""
      end
      array_stack.pop
      arguments[key.intern] = array if array_stack.empty?
    when /[, ]/
      if in_string
        buffer << char
      else
        if key.nil? || buffer == ""
          next
        elsif array_stack.any?
          array_stack.last << raw_string_to_type(buffer)
          buffer = ""
          next
        elsif key =~ /^\$/
          system_items[key.tr('$', '').intern] = raw_string_to_type(buffer)
        else
          arguments[key.intern] = raw_string_to_type(buffer)
        end
        buffer = ""
        key = nil
      end
    else
      buffer << char
    end
  end
end
raw_string_to_type(raw) click to toggle source
# File lib/telos_lwcp/command.rb, line 96
def raw_string_to_type(raw)
  case raw
  when /^"(.*)"$/
    $1
  when /^\d+$/
    raw.to_i
  when /^TRUE$/
    true
  when /^FALSE$/
    false
  else
    raw.intern
  end
end