From 61c285746c82de927c1aeed1f465b828000a776f Mon Sep 17 00:00:00 2001 From: Alex Orlenko Date: Mon, 19 Dec 2022 23:05:17 +0000 Subject: [PATCH] Remove FromLua impl for UserData+Clone --- examples/guided_tour.rs | 14 +++++++++++++- src/conversion.rs | 15 --------------- tests/userdata.rs | 13 +++++++++++-- 3 files changed, 24 insertions(+), 18 deletions(-) diff --git a/examples/guided_tour.rs b/examples/guided_tour.rs index 9cbe786..becd626 100644 --- a/examples/guided_tour.rs +++ b/examples/guided_tour.rs @@ -1,7 +1,9 @@ use std::f32; use std::iter::FromIterator; -use mlua::{chunk, Function, Lua, MetaMethod, Result, UserData, UserDataMethods, Variadic}; +use mlua::{ + chunk, FromLua, Function, Lua, MetaMethod, Result, UserData, UserDataMethods, Value, Variadic, +}; fn main() -> Result<()> { // You can create a new Lua state with `Lua::new()`. This loads the default Lua std library @@ -151,6 +153,16 @@ fn main() -> Result<()> { #[derive(Copy, Clone)] struct Vec2(f32, f32); + // We can implement `FromLua` trait for our `Vec2` to return a copy + impl<'lua> FromLua<'lua> for Vec2 { + fn from_lua(value: Value<'lua>, _: &'lua Lua) -> Result { + match value { + Value::UserData(ud) => Ok(*ud.borrow::()?), + _ => unreachable!(), + } + } + } + impl UserData for Vec2 { fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) { methods.add_method("magnitude", |_, vec, ()| { diff --git a/src/conversion.rs b/src/conversion.rs index fc0a544..cc9227c 100644 --- a/src/conversion.rs +++ b/src/conversion.rs @@ -194,21 +194,6 @@ impl<'lua, T: 'static + MaybeSend + UserData> IntoLua<'lua> for T { } } -// TODO: Remove -impl<'lua, T: 'static + UserData + Clone> FromLua<'lua> for T { - #[inline] - fn from_lua(value: Value<'lua>, _: &'lua Lua) -> Result { - match value { - Value::UserData(ud) => Ok(ud.borrow::()?.clone()), - _ => Err(Error::FromLuaConversionError { - from: value.type_name(), - to: "userdata", - message: None, - }), - } - } -} - impl<'lua> IntoLua<'lua> for Error { #[inline] fn into_lua(self, _: &'lua Lua) -> Result> { diff --git a/tests/userdata.rs b/tests/userdata.rs index d2b59ca..fae0bf8 100644 --- a/tests/userdata.rs +++ b/tests/userdata.rs @@ -12,8 +12,8 @@ use std::{cell::RefCell, rc::Rc}; use std::sync::atomic::{AtomicI64, Ordering}; use mlua::{ - AnyUserData, Error, ExternalError, Function, Lua, MetaMethod, Nil, Result, String, UserData, - UserDataFields, UserDataMethods, Value, + AnyUserData, Error, ExternalError, FromLua, Function, Lua, MetaMethod, Nil, Result, String, + UserData, UserDataFields, UserDataMethods, Value, }; #[test] @@ -95,6 +95,15 @@ fn test_metamethods() -> Result<()> { #[derive(Copy, Clone)] struct MyUserData(i64); + impl<'lua> FromLua<'lua> for MyUserData { + fn from_lua(value: Value<'lua>, _: &'lua Lua) -> Result { + match value { + Value::UserData(ud) => Ok(ud.borrow::()?.clone()), + _ => unreachable!(), + } + } + } + impl UserData for MyUserData { fn add_methods<'lua, M: UserDataMethods<'lua, Self>>(methods: &mut M) { methods.add_method("get", |_, data, ()| Ok(data.0));