mlua icon indicating copy to clipboard operation
mlua copied to clipboard

How about `impl ToLua for dyn Serialize` and `impl FromLua for dyn Deserialize`?

Open rise0chen opened this issue 3 years ago • 7 comments

rise0chen avatar Apr 25 '22 07:04 rise0chen

serde::Serialize and serde::Deserialize cannot be dyn.

khvzak avatar Apr 25 '22 22:04 khvzak

yes, serde::Serialize and serde::Deserialize is not Object Safety

rise0chen avatar Apr 26 '22 02:04 rise0chen

pub struct CompatSerialize<T: Serialize>(T);
impl<'lua, T: Serialize> ToLua<'lua> for CompatSerialize<T> {
    fn to_lua(self, lua: &'lua Lua) -> Result<Value<'lua>> {
        let serializer = Serializer::new(lua);
        self.0.serialize(serializer).map_err(|_|Error::ToLuaConversionError{from:"",to:"", message:None})
    }
}

pub struct CompatDeserialize<'lua, T: de::Deserialize<'lua>>(pub T, PhantomData<&'lua ()>);
impl<'lua, T: de::Deserialize<'lua>> FromLua<'lua> for CompatDeserialize<'lua, T> {
    fn from_lua(lua_value: Value<'lua>, _: &'lua Lua) -> Result<Self>{
        let deserializer = Deserializer::new(lua_value);
        match T::deserialize(deserializer){
            Ok(data)=>Ok(CompatDeserialize( data,PhantomData)),
            Err(_)=>Err(Error::FromLuaConversionError{from:"",to:"",message:None}),
        }
    }
}

How about this?

fn fun<'lua>(lua: &'lua Lua, arg: CompatDeserialize<StructB>) -> LuaResult<CompatSerialize<StructA>> {
    ...
}
lua.create_function(fun)

rise0chen avatar Apr 26 '22 02:04 rise0chen

I'm not sure that I got your request. You're free to implement ToLua/FromLua for your types.

khvzak avatar Apr 26 '22 23:04 khvzak

fn fun<'lua>(lua: &'lua Lua, arg: StructB) -> LuaResult<StructA> {
    ...
}
lua.create_function(fun)

StructA and StructB had impl Serialize and Deserialize. I think it can auto impl ToLua and FromLua.

rise0chen avatar Apr 27 '22 01:04 rise0chen

I’m afraid they cannot. Blanket implementation is already taken by T where T: UserData

khvzak avatar Apr 27 '22 11:04 khvzak

I hope convert Struct to LuaTable rather than UserData

rise0chen avatar Apr 28 '22 07:04 rise0chen