diff --git a/src/conversion.rs b/src/conversion.rs index e5fb894..1f02899 100644 --- a/src/conversion.rs +++ b/src/conversion.rs @@ -229,6 +229,28 @@ impl<'lua> ToLua<'lua> for Cow<'_, str> { } } +impl<'lua> ToLua<'lua> for Box { + fn to_lua(self, lua: &'lua Lua) -> Result> { + Ok(Value::String(lua.create_string(&*self)?)) + } +} + +impl<'lua> FromLua<'lua> for Box { + fn from_lua(value: Value<'lua>, lua: &'lua Lua) -> Result { + let ty = value.type_name(); + Ok(lua + .coerce_string(value)? + .ok_or_else(|| Error::FromLuaConversionError { + from: ty, + to: "Box", + message: Some("expected string or number".to_string()), + })? + .to_str()? + .to_owned() + .into_boxed_str()) + } +} + impl<'lua> ToLua<'lua> for CString { fn to_lua(self, lua: &'lua Lua) -> Result> { Ok(Value::String(lua.create_string(self.as_bytes())?)) @@ -436,6 +458,26 @@ lua_convert_array! { 30 31 32 } +impl<'lua, T: ToLua<'lua>> ToLua<'lua> for Box<[T]> { + fn to_lua(self, lua: &'lua Lua) -> Result> { + Ok(Value::Table(lua.create_sequence_from(self.into_vec())?)) + } +} + +impl<'lua, T: FromLua<'lua>> FromLua<'lua> for Box<[T]> { + fn from_lua(value: Value<'lua>, _: &'lua Lua) -> Result { + if let Value::Table(table) = value { + table.sequence_values().collect() + } else { + Err(Error::FromLuaConversionError { + from: value.type_name(), + to: "Box<[T]>", + message: Some("expected table".to_string()), + }) + } + } +} + 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/conversion.rs b/tests/conversion.rs index 01110d1..71d76ba 100644 --- a/tests/conversion.rs +++ b/tests/conversion.rs @@ -88,3 +88,27 @@ fn test_conv_cow() -> Result<()> { Ok(()) } + +#[test] +fn test_conv_boxed_str() -> Result<()> { + let lua = Lua::new(); + + let s = String::from("hello").into_boxed_str(); + lua.globals().set("s", s.clone())?; + let s2: Box = lua.globals().get("s")?; + assert!(s == s2); + + Ok(()) +} + +#[test] +fn test_conv_boxed_slice() -> Result<()> { + let lua = Lua::new(); + + let v = vec![1, 2, 3].into_boxed_slice(); + lua.globals().set("v", v.clone())?; + let v2: Box<[i32]> = lua.globals().get("v")?; + assert!(v == v2); + + Ok(()) +}