main.lua

Sat, 19 Sep 2015 21:44:59 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Sat, 19 Sep 2015 21:44:59 +0100
changeset 21
8ac80da35408
parent 14
ad0dd3d45edc
child 30
3c2489e79074
permissions
-rwxr-xr-x

main: Refactor into functions

#!/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.."'");
			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

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

if not ok then
	print("TEST ERROR:", result);
elseif not result then
	print("TEST FAILED", err);
else
	print("TEST PASSED");
end

mercurial