How about `impl ToLua for dyn Serialize` and `impl FromLua for dyn Deserialize`?
serde::Serialize and serde::Deserialize cannot be dyn.
yes, serde::Serialize and serde::Deserialize is not Object Safety
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)
I'm not sure that I got your request.
You're free to implement ToLua/FromLua for your types.
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.
I’m afraid they cannot. Blanket implementation is already taken by T where T: UserData
I hope convert Struct to LuaTable rather than UserData