From a1cd2b6a4fef7970e9ab7215791cb4cea3e10e22 Mon Sep 17 00:00:00 2001 From: Trezy Date: Thu, 26 Feb 2026 22:40:38 -0600 Subject: [PATCH] feat: add `toarray()` so users can force a Lua table to serialize to an array --- src/lua/sandbox.rs | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/src/lua/sandbox.rs b/src/lua/sandbox.rs index 86c72d0..aafdc8d 100644 --- a/src/lua/sandbox.rs +++ b/src/lua/sandbox.rs @@ -1,4 +1,4 @@ -use mlua::{Lua, Result as LuaResult}; +use mlua::{Lua, LuaSerdeExt, Result as LuaResult}; use super::tid::generate_tid; @@ -49,6 +49,16 @@ pub fn create_sandbox() -> LuaResult { let tid_fn = lua.create_function(|_, ()| Ok(generate_tid()))?; globals.set("TID", tid_fn)?; + // Utility: toarray(table) marks a table as a JSON array for serialization. + // Ensures empty tables serialize as [] instead of {}. + let toarray_fn = lua.create_function(|lua, table: mlua::Table| { + let values: Vec = table.sequence_values().collect::>()?; + let seq = lua.create_sequence_from(values)?; + seq.set_metatable(Some(lua.array_metatable()))?; + Ok(seq) + })?; + globals.set("toarray", toarray_fn)?; + Ok(lua) } @@ -143,4 +153,32 @@ mod tests { let result = validate_script("function handle("); assert!(result.is_err()); } + + #[test] + fn sandbox_provides_toarray() { + let lua = create_sandbox().unwrap(); + lua.load(r#"result = toarray({})"#).exec().unwrap(); + } + + #[test] + fn sandbox_toarray_preserves_values() { + let lua = create_sandbox().unwrap(); + let result: Vec = lua + .load(r#"return toarray({10, 20, 30})"#) + .eval::() + .unwrap() + .sequence_values() + .collect::>() + .unwrap(); + assert_eq!(result, vec![10, 20, 30]); + } + + #[test] + fn sandbox_toarray_empty_serializes_as_array() { + use mlua::LuaSerdeExt; + let lua = create_sandbox().unwrap(); + let table: mlua::Table = lua.load(r#"return toarray({})"#).eval().unwrap(); + let json: serde_json::Value = lua.from_value(mlua::Value::Table(table)).unwrap(); + assert!(json.is_array(), "expected JSON array, got: {json}"); + } } -- 2.51.2