main.lua

changeset 21
8ac80da35408
parent 14
ad0dd3d45edc
child 30
3c2489e79074
equal deleted inserted replaced
20:cd1fc52f1b26 21:8ac80da35408
1 #!/usr/bin/env lua5.1 1 #!/usr/bin/env lua5.1
2 2
3 local parser = require "scansion.parser";
4 3
5 io.input(arg[1]);
6 local script_data = io.read("*a");
7 4
8 local script = assert(parser.parse(script_data)); 5 function read_script()
9 6 io.input(arg[1]);
10 local c = 0; 7 return io.read("*a");
11 for name, object in pairs(script.objects) do 8
12 local o = require("scansion.objects."..object.type);
13 object.handler = o;
14 object.script = script;
15 o._validate(object);
16 c = c + 1;
17 end 9 end
18 10
19 print("Script defines "..c.." objects, and "..#script.actions.." actions"); 11 function parse_script(data)
12 local parser = require "scansion.parser";
13 return assert(parser.parse(data));
14 end
20 15
21 local verse = require "verse"; 16 function initialize_script(script)
22 require "util.logger"; 17 local c = 0;
23 local async = require "scansion.async"; 18 for name, object in pairs(script.objects) do
19 local o = require("scansion.objects."..object.type);
20 object.handler = o;
21 object.script = script;
22 o._validate(object);
23 c = c + 1;
24 end
25
26 --print("Script defines "..c.." objects, and "..#script.actions.." actions");
27 return script;
28 end
24 29
25 local runner = async.runner(function () 30 function initialize_verse(errcb)
26 print("f") 31 local verse = require "verse";
27 for _, action in pairs(script.actions) do 32
28 local object = script.objects[action.object_name]; 33 verse.set_log_handler(verse._default_log_handler, { "debug", "info", "warn", "error" });
29 local handler = object.handler; 34
30 assert(handler[action.action], "Objects of type '"..object.type.."' do not support action '"..action.action.."'"); 35 local function error_handler(err)
31 print(object.name, action.action.."..."); 36 verse.log("error", "Error: %s", err);
32 handler[action.action](object, action.extra); 37 verse.log("error", "Traceback: %s", debug.traceback());
38 errcb(err);
33 end 39 end
34 end, { 40 verse.set_error_handler(error_handler);
35 error = function (runner, err) 41 return verse;
36 print("Error: ", err); 42 end
37 verse.quit();
38 end;
39 });
40 43
41 runner:run(true); 44 function main()
42 print("runner paused") 45 local ok, err = true;
43 46
44 verse.loop() 47 local script = initialize_script(parse_script(read_script()));
48
49 local verse = initialize_verse(function (_err) ok, err = false, _err end);
50 local async = require "scansion.async";
51
52
53 local runner = async.runner(function (d)
54 for _, action in pairs(script.actions) do
55 local object = script.objects[action.object_name];
56 local handler = object.handler;
57 assert(handler[action.action], "Objects of type '"..object.type.."' do not support action '"..action.action.."'");
58 print(object.name, action.action.."...");
59 local ok, err = pcall(handler[action.action], object, action.extra);
60 if not ok then
61 error(err);
62 end
63 end
64 verse.log("info", "Completed script!");
65 verse.add_task(5, function ()
66 verse.quit();
67 end);
68 end, {
69 error = function (runner, _err)
70 verse.log("error", "Runner caught error: %s", _err);
71 ok, err = false, _err;
72 verse.quit();
73 end;
74 });
75
76 runner:run(true);
77 verse.log("debug", "runner paused")
78
79 verse.loop();
80 return ok, err;
81 end
82
83 local ok, result, err = pcall(main);
84
85 if not ok then
86 print("TEST ERROR:", result);
87 elseif not result then
88 print("TEST FAILED", err);
89 else
90 print("TEST PASSED");
91 end

mercurial