main.lua

Tue, 27 Oct 2015 23:14:19 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Tue, 27 Oct 2015 23:14:19 +0000
changeset 46
d711bf1e9979
parent 43
b37504fa3031
parent 35
90219526e942
child 54
09a754d5fcc1
permissions
-rwxr-xr-x

Merge

#!/usr/bin/env lua5.1



function read_script()
	io.input(arg[1]);
	return io.read("*a");
	
end

function parse_script(data)
	local parser = require "scansion.parser";
	return assert(parser.parse(data));
end

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

function main()
	local ok, err = true;

	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 (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.."'");
			if action.annotation then
				print(action.annotation);
			end
			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.quit();
	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

local ok, result, err = pcall(main);

if not ok then
	print("TEST ERROR:", result);
	os.exit(2);
elseif not result then
	print("TEST FAILED", err);
	os.exit(1);
else
	print("TEST PASSED");
	os.exit(0);
end

mercurial