silverbullet/common/space_lua/stdlib.ts

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;
}