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 |