main.lua

changeset 21
8ac80da35408
parent 14
ad0dd3d45edc
child 30
3c2489e79074
--- 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

mercurial