diff --git a/lib/space_lua/lua.test.ts b/lib/space_lua/lua.test.ts index 2f93fef9..cd154e06 100644 --- a/lib/space_lua/lua.test.ts +++ b/lib/space_lua/lua.test.ts @@ -38,7 +38,11 @@ Deno.test("[Lua] Global functions tests", async () => { await runLuaTest("./stdlib/global_test.lua"); }); -Deno.test("[Lua] Lua functions tests", async () => { +Deno.test("[Lua] Encoding functions tests", async () => { + await runLuaTest("./stdlib/encoding_test.lua"); +}); + +Deno.test("[Lua] Lume functions tests", async () => { await runLuaTest("./lume_test.lua"); }); diff --git a/lib/space_lua/stdlib.ts b/lib/space_lua/stdlib.ts index 85781c49..b957e836 100644 --- a/lib/space_lua/stdlib.ts +++ b/lib/space_lua/stdlib.ts @@ -20,6 +20,7 @@ import { spaceluaApi } from "./stdlib/space_lua.ts"; import { mathApi } from "./stdlib/math.ts"; import { parse } from "./parse.ts"; import { evalStatement } from "./eval.ts"; +import { encodingApi } from "./stdlib/encoding.ts"; const printFunction = new LuaBuiltinFunction(async (_sf, ...args) => { console.log( @@ -312,6 +313,7 @@ export function luaBuildStandardEnv() { // Non-standard env.set("each", eachFunction); env.set("spacelua", spaceluaApi); + env.set("encoding", encodingApi); env.set("some", someFunction); return env; } diff --git a/lib/space_lua/stdlib/encoding.ts b/lib/space_lua/stdlib/encoding.ts new file mode 100644 index 00000000..ffc182f6 --- /dev/null +++ b/lib/space_lua/stdlib/encoding.ts @@ -0,0 +1,19 @@ +import { LuaBuiltinFunction, LuaTable } from "../runtime.ts"; +import { base64Decode, base64Encode } from "../../crypto.ts"; + +export const encodingApi = new LuaTable({ + base64Encode: new LuaBuiltinFunction( + (_sf, s: string | Uint8Array): string => { + return base64Encode(s); + }, + ), + base64Decode: new LuaBuiltinFunction((_sf, s: string): Uint8Array => { + return base64Decode(s); + }), + utf8Encode: new LuaBuiltinFunction((_sf, s: string): Uint8Array => { + return new TextEncoder().encode(s); + }), + utf8Decode: new LuaBuiltinFunction((_sf, data: Uint8Array): string => { + return new TextDecoder().decode(data); + }), +}); diff --git a/lib/space_lua/stdlib/encoding_test.lua b/lib/space_lua/stdlib/encoding_test.lua new file mode 100644 index 00000000..a4d0b5ad --- /dev/null +++ b/lib/space_lua/stdlib/encoding_test.lua @@ -0,0 +1,9 @@ +local function assertEqual(a, b) + if a ~= b then + error("Assertion failed: " .. a .. " is not equal to " .. b) + end +end + + +assertEqual(encoding.utf8Decode(encoding.utf8Encode("test")), "test") +assertEqual(encoding.utf8Decode(encoding.base64Decode(encoding.base64Encode("test"))), "test") diff --git a/website/API/encoding.md b/website/API/encoding.md new file mode 100644 index 00000000..0d645417 --- /dev/null +++ b/website/API/encoding.md @@ -0,0 +1,13 @@ +The `encoding` API implements a few useful functions to handle various types of encoding. + +### encoding.base64Encode(data) +Encodes data (either a string or byte buffer) as a base64 encoded string. + +### encoding.base64Decode(s) +Decodes a base64 encoded string into a byte buffer. + +### encoding.utf8Encode(s) +Encodes a (UTF-8) string into a byte buffer. + +### encoding.utf8Decode(data) +Decodes a byte buffer into a (UTF-8) string. \ No newline at end of file