lib/gobstones/cli/runner.rb in gobstones-0.0.2 vs lib/gobstones/cli/runner.rb in gobstones-0.0.3

- old
+ new

@@ -3,15 +3,12 @@ require 'gobstones/cli/printer' include Gobstones::Parser module Gobstones - module CLI - class Runner - def self.run(file_name) new(File.read(file_name)).run end def initialize(code) @@ -19,40 +16,78 @@ @parser = Gobstones::Parser::TreetopParser.new end def run print_program_result parse_program.evaluate - rescue Gobstones::Parser::ParseError => parse_error - handle_parse_error parse_error - rescue Gobstones::Runner::GobstonesTypeError => type_error - handle_type_error type_error - rescue Exception => e - # TODO handle more gobstones exceptions + rescue Gobstones::Parser::ParseError => e + handle_parse_error e + rescue Gobstones::Runner::GobstonesTypeError => e + handle_type_error e + rescue Gobstones::Runner::BoomError => e + handle_boom_error e + rescue Gobstones::Runner::UndefinedVariableError => e + handle_undefined_variable_error e + rescue Gobstones::Runner::EmptyCellError => e + handle_empty_cell_error e + rescue Gobstones::Runner::OutOfBoardError => e + handle_out_of_board_error e + rescue Gobstones::Runner::DefinitionNotFound => e + handle_definition_not_found_error e + rescue Gobstones::Runner::WrongArgumentsError => e + handle_wrong_arguments_error e + rescue Gobstones::Runner::GobstonesRuntimeError => e + handle_runtime_error e + rescue StandardError => e raise e end private - def print_program_result(context) - Printer.new(context).print + def print_program_result(result) + Printer.new(result).print end def parse_program @parser.parse @code end def handle_parse_error(parse_error) parse_error.parser.failure_reason =~ /^(Expected .+) after/m - puts "#{$1.gsub("\n", '$NEWLINE')}:" + puts "#{Regexp.last_match(1).gsub("\n", '$NEWLINE')}:" puts parse_error.code.lines.to_a[parse_error.parser.failure_line - 1] puts "#{'~' * (parse_error.parser.failure_column - 1)}^" end def handle_type_error(type_error) - puts "Type Error: #{type_error.message} occurred in #{type_error.statement}" + puts "Type Error: #{type_error.message}" end - end + def handle_boom_error(boom_error) + puts "BOOM!! #{boom_error.message}" + end - end + def handle_undefined_variable_error(undefined_variable_error) + puts undefined_variable_error.message + end + def handle_empty_cell_error(_empty_cell_error) + puts 'There are no balls to take out!' + end + + def handle_out_of_board_error(_out_of_board_error) + puts 'You fell from the board!' + end + + def handle_definition_not_found_error(definition_not_found_error) + puts definition_not_found_error.message + end + + def handle_wrong_arguments_error(wrong_arguments_error) + puts wrong_arguments_error.message + end + + def handle_runtime_error(runtime_error) + puts runtime_error.message + end + end + end end