diff -r cd1fc52f1b26 -r 8ac80da35408 main.lua --- a/main.lua Sat Sep 19 21:44:40 2015 +0100 +++ b/main.lua Sat Sep 19 21:44:59 2015 +0100 @@ -1,44 +1,91 @@ #!/usr/bin/env lua5.1 -local parser = require "scansion.parser"; + -io.input(arg[1]); -local script_data = io.read("*a"); +function read_script() + io.input(arg[1]); + return io.read("*a"); + +end -local script = assert(parser.parse(script_data)); +function parse_script(data) + local parser = require "scansion.parser"; + return assert(parser.parse(data)); +end -local c = 0; -for name, object in pairs(script.objects) do - local o = require("scansion.objects."..object.type); - object.handler = o; - object.script = script; - o._validate(object); - c = c + 1; +function initialize_script(script) + local c = 0; + for name, object in pairs(script.objects) do + local o = require("scansion.objects."..object.type); + object.handler = o; + object.script = script; + o._validate(object); + c = c + 1; + end + + --print("Script defines "..c.." objects, and "..#script.actions.." actions"); + return script; +end + +function initialize_verse(errcb) + local verse = require "verse"; + + verse.set_log_handler(verse._default_log_handler, { "debug", "info", "warn", "error" }); + + local function error_handler(err) + verse.log("error", "Error: %s", err); + verse.log("error", "Traceback: %s", debug.traceback()); + errcb(err); + end + verse.set_error_handler(error_handler); + return verse; end -print("Script defines "..c.." objects, and "..#script.actions.." actions"); +function main() + local ok, err = true; -local verse = require "verse"; -require "util.logger"; -local async = require "scansion.async"; + local script = initialize_script(parse_script(read_script())); + + local verse = initialize_verse(function (_err) ok, err = false, _err end); + local async = require "scansion.async"; -local runner = async.runner(function () - print("f") - for _, action in pairs(script.actions) do - local object = script.objects[action.object_name]; - local handler = object.handler; - assert(handler[action.action], "Objects of type '"..object.type.."' do not support action '"..action.action.."'"); - print(object.name, action.action.."..."); - handler[action.action](object, action.extra); - end -end, { - error = function (runner, err) - print("Error: ", err); - verse.quit(); - end; -}); + + local runner = async.runner(function (d) + for _, action in pairs(script.actions) do + local object = script.objects[action.object_name]; + local handler = object.handler; + assert(handler[action.action], "Objects of type '"..object.type.."' do not support action '"..action.action.."'"); + print(object.name, action.action.."..."); + local ok, err = pcall(handler[action.action], object, action.extra); + if not ok then + error(err); + end + end + verse.log("info", "Completed script!"); + verse.add_task(5, function () + verse.quit(); + end); + end, { + error = function (runner, _err) + verse.log("error", "Runner caught error: %s", _err); + ok, err = false, _err; + verse.quit(); + end; + }); + + runner:run(true); + verse.log("debug", "runner paused") + + verse.loop(); + return ok, err; +end -runner:run(true); -print("runner paused") +local ok, result, err = pcall(main); -verse.loop() +if not ok then + print("TEST ERROR:", result); +elseif not result then + print("TEST FAILED", err); +else + print("TEST PASSED"); +end