class LIRC::Messages::ResponseParser

Constants

PARSER_METHOD_FOR
STATES

Attributes

message[R]

Public Class Methods

new(state = :waiting_begin) click to toggle source
# File lib/lirc/messages/response_parser.rb, line 28
def initialize(state = :waiting_begin)
  @state = state
  @message = Response.new
end

Public Instance Methods

parse_line(line) click to toggle source
# File lib/lirc/messages/response_parser.rb, line 38
def parse_line(line)
  line = line.chomp

  __send__(PARSER_METHOD_FOR.fetch(@state), line)
end
valid?() click to toggle source

 returns true when message is ready

# File lib/lirc/messages/response_parser.rb, line 34
def valid?
  @state.equal?(:valid)
end

Private Instance Methods

parse_begin(line) click to toggle source
# File lib/lirc/messages/response_parser.rb, line 46
def parse_begin(line)
  unless line.eql?("BEGIN")
    raise ParseError, "unexpected line, expecting BEGIN, got #{line}"
  end

  @state = :waiting_command
end
parse_command(line) click to toggle source
# File lib/lirc/messages/response_parser.rb, line 54
def parse_command(line)
  if Commands.all_commands.include?(line.split.first)
    message.command = line
    @state = :waiting_success
  elsif line.eql?("SIGHUP")
    message.command = line
    @state = :waiting_end
  else
    raise ParseError,
      "invalid command #{line}, expecting first word to be one of " \
      "LIRC::Commands.all_commands, or SIGHUP"
  end
end
parse_data(line) click to toggle source
# File lib/lirc/messages/response_parser.rb, line 77
def parse_data(line)
  case line
  when "DATA"
    @state = :waiting_data_length
  when "END"
    @state = :valid
  else
    raise ParseError, "Expecting DATA or END, got #{line}"
  end
end
parse_data_length(line) click to toggle source
# File lib/lirc/messages/response_parser.rb, line 88
def parse_data_length(line)
  if line =~ /[^0-9]/
    raise ParseError, "Expecting a number, got #{line}"
  end

  @data_lines_to_read = Integer(line)
  message.data = []
  @state = :reading_data
end
parse_end(line) click to toggle source
# File lib/lirc/messages/response_parser.rb, line 98
def parse_end(line)
  unless line.eql?("END")
    raise ParseError, "Expecting END, got #{line}"
  end

  @state = :valid
end
parse_success(line) click to toggle source
# File lib/lirc/messages/response_parser.rb, line 68
def parse_success(line)
  unless %w[SUCCESS ERROR].include?(line)
    raise ParseError, "Expecting SUCCESS or ERROR, got #{line}"
  end

  message.success = line.eql?("SUCCESS")
  @state = :waiting_data
end
raise_already_valid(line) click to toggle source
# File lib/lirc/messages/response_parser.rb, line 123
def raise_already_valid(line)
  raise ParseError,
    "Response was successfully parsed, " \
    "but #parse was called again with #{line}"
end
read_data(line) click to toggle source
# File lib/lirc/messages/response_parser.rb, line 106
def read_data(line)
  if @data_lines_to_read.zero?
    unless line.eql?("END")
      raise ParseError, "Expecting END, got more data: '#{line}'"
    end

    message.data = message.data&.join("\n").freeze
    @state = :valid
    return
  end

  message.data ||= []

  @data_lines_to_read -= 1
  message.data << line
end