76 lines
1.8 KiB
TypeScript
76 lines
1.8 KiB
TypeScript
import {
|
|
LuaBuiltinFunction,
|
|
LuaEnv,
|
|
LuaMultiRes,
|
|
LuaNativeJSFunction,
|
|
type LuaTable,
|
|
luaTypeOf,
|
|
} from "$common/space_lua/runtime.ts";
|
|
|
|
const printFunction = new LuaNativeJSFunction((...args) => {
|
|
console.log("[Lua]", ...args);
|
|
});
|
|
|
|
const assertFunction = new LuaNativeJSFunction(
|
|
(value: any, message?: string) => {
|
|
if (!value) {
|
|
throw new Error(`Assertion failed: ${message}`);
|
|
}
|
|
},
|
|
);
|
|
|
|
const ipairsFunction = new LuaNativeJSFunction((ar: any[]) => {
|
|
let i = 0;
|
|
return () => {
|
|
if (i >= ar.length) {
|
|
return;
|
|
}
|
|
const result = new LuaMultiRes([i, ar[i]]);
|
|
i++;
|
|
return result;
|
|
};
|
|
});
|
|
|
|
const pairsFunction = new LuaBuiltinFunction((t: LuaTable) => {
|
|
const keys = t.keys();
|
|
let i = 0;
|
|
return () => {
|
|
if (i >= keys.length) {
|
|
return;
|
|
}
|
|
const key = keys[i];
|
|
const result = new LuaMultiRes([key, t.get(key)]);
|
|
i++;
|
|
return result;
|
|
};
|
|
});
|
|
|
|
const typeFunction = new LuaNativeJSFunction((value: any) => {
|
|
return luaTypeOf(value);
|
|
});
|
|
|
|
const tostringFunction = new LuaNativeJSFunction((value: any) => {
|
|
return String(value);
|
|
});
|
|
|
|
const tonumberFunction = new LuaNativeJSFunction((value: any) => {
|
|
return Number(value);
|
|
});
|
|
|
|
const errorFunction = new LuaNativeJSFunction((message: string) => {
|
|
throw new Error(message);
|
|
});
|
|
|
|
export function luaBuildStandardEnv() {
|
|
const env = new LuaEnv();
|
|
env.set("print", printFunction);
|
|
env.set("assert", assertFunction);
|
|
env.set("pairs", pairsFunction);
|
|
env.set("ipairs", ipairsFunction);
|
|
env.set("type", typeFunction);
|
|
env.set("tostring", tostringFunction);
|
|
env.set("tonumber", tonumberFunction);
|
|
env.set("error", errorFunction);
|
|
return env;
|
|
}
|