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