diff --git a/src/conversion.rs b/src/conversion.rs index 51c6efd..63ad5fd 100644 --- a/src/conversion.rs +++ b/src/conversion.rs @@ -373,6 +373,50 @@ macro_rules! lua_convert_float { lua_convert_float!(f32); lua_convert_float!(f64); +impl<'lua, T> ToLua<'lua> for &'_ [T] +where + T: Clone + ToLua<'lua>, +{ + fn to_lua(self, lua: &'lua Lua) -> Result> { + Ok(Value::Table( + lua.create_sequence_from(self.into_iter().cloned())?, + )) + } +} + +macro_rules! lua_convert_array { + ($($N:literal)+) => { + $( + impl<'lua, T> ToLua<'lua> for [T; $N] + where + T: Clone + ToLua<'lua>, + { + fn to_lua(self, lua: &'lua Lua) -> Result> { + (&self).to_lua(lua) + } + } + + impl<'lua, T> ToLua<'lua> for &'_ [T; $N] + where + T: Clone + ToLua<'lua>, + { + fn to_lua(self, lua: &'lua Lua) -> Result> { + Ok(Value::Table( + lua.create_sequence_from(self.iter().cloned())?, + )) + } + } + )+ + } +} + +lua_convert_array! { + 0 1 2 3 4 5 6 7 8 9 + 10 11 12 13 14 15 16 17 18 19 + 20 21 22 23 24 25 26 27 28 29 + 30 31 32 +} + impl<'lua, T: ToLua<'lua>> ToLua<'lua> for Vec { fn to_lua(self, lua: &'lua Lua) -> Result> { Ok(Value::Table(lua.create_sequence_from(self)?)) diff --git a/tests/table.rs b/tests/table.rs index caab9e1..6378e5c 100644 --- a/tests/table.rs +++ b/tests/table.rs @@ -109,6 +109,47 @@ fn test_table() -> Result<()> { Ok(()) } +#[test] +fn test_table_sequence_from() -> Result<()> { + let lua = Lua::new(); + + let get_table = lua.create_function(|_, t: Table| Ok(t))?; + + assert_eq!( + get_table + .call::<_, Table>(vec![1, 2, 3])? + .sequence_values() + .collect::>>()?, + vec![1, 2, 3] + ); + + assert_eq!( + get_table + .call::<_, Table>([1, 2, 3].as_ref())? + .sequence_values() + .collect::>>()?, + vec![1, 2, 3] + ); + + assert_eq!( + get_table + .call::<_, Table>([1, 2, 3])? + .sequence_values() + .collect::>>()?, + vec![1, 2, 3] + ); + + assert_eq!( + get_table + .call::<_, Table>(&[1, 2, 3])? + .sequence_values() + .collect::>>()?, + vec![1, 2, 3] + ); + + Ok(()) +} + #[test] fn test_table_scope() -> Result<()> { let lua = Lua::new();