1 /** Manages a LuaState object.*/
2 module bluejay.execution_state;
3
4 import luad.all;
5
6 struct Options {
7 bool luastd = false;
8 bool recurse = false;
9 string scriptPath;
10 }
11
12 class ExecutionState {
13 import bluejay.functions;
14 private:
15
16 TestFunctions _testFunctions;
17 UtilFunctions _utilFunctions;
18 ScriptFunctions _scriptFunctions;
19
20 public:
21
22 // It would be nice to make this `package` but alias this won't work.
23 LuaState _lua;
24 alias _lua this;
25
26 this(Options options) {
27 this._lua = new LuaState;
28
29 if (options.luastd) {
30 _lua.openLibs();
31 } else {
32 import luad.c.all;
33 // TODO: Add utf8, table?
34 luaopen_base(_lua.state);
35 luaopen_string(_lua.state);
36 }
37
38 setVariables(_lua);
39 _testFunctions = new TestFunctions(_lua, options);
40 _utilFunctions = UtilFunctions(_lua);
41 _scriptFunctions = new ScriptFunctions(_lua);
42 _lua["Test"] = _testFunctions;
43 _lua["Util"] = _utilFunctions;
44 _lua["Script"] = _scriptFunctions;
45 _lua.doString("function cleanup() end");
46 }
47
48 private void setVariables(ref LuaState lua) {
49 import std.typecons : Tuple, tuple;
50
51 Tuple!(string, string)[] system;
52 version(Windows) {
53 system ~= tuple("OS", "Windows");
54 system ~= tuple("endl", "\r\n");
55 } else version(linux) {
56 system ~= tuple("OS", "Linux");
57 system ~= tuple("endl", "\n");
58 } else version(OSX) {
59 system ~= tuple("OS", "macOS");
60 system ~= tuple("endl", "\n");
61 }
62 version(X86) {
63 system ~= tuple("Arch", "x86");
64 } else version(X86_64) {
65 system ~= tuple("Arch", "x86_64");
66 } else version(ARM) {
67 system ~= tuple("Arch", "ARM");
68 }
69 lua["System"] = lua.newTable(system);
70
71 import std.process : environment;
72 Tuple!(string, string)[] environ;
73 foreach (env; environment.toAA.byKeyValue) {
74 environ ~= tuple(env.key, env.value);
75 }
76 lua["Env"] = lua.newTable(environ);
77 }
78 }