Add `UserDataMethods::` `add_function_mut` and `add_meta_function_mut`
This commit is contained in:
parent
7231e95195
commit
ea834635c1
|
@ -127,6 +127,22 @@ impl<'lua, T: UserData> UserDataMethods<'lua, T> {
|
||||||
.insert(name.to_owned(), Self::box_function(function));
|
.insert(name.to_owned(), Self::box_function(function));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Add a regular method as a mutable function which accepts generic arguments, the first
|
||||||
|
/// argument will always be a `UserData` of type T.
|
||||||
|
///
|
||||||
|
/// This is a version of [`add_function`] that accepts a FnMut argument.
|
||||||
|
///
|
||||||
|
/// [`add_function`]: #method.add_function
|
||||||
|
pub fn add_function_mut<A, R, F>(&mut self, name: &str, function: F)
|
||||||
|
where
|
||||||
|
A: FromLuaMulti<'lua>,
|
||||||
|
R: ToLuaMulti<'lua>,
|
||||||
|
F: 'static + Send + FnMut(&'lua Lua, A) -> Result<R>,
|
||||||
|
{
|
||||||
|
self.methods
|
||||||
|
.insert(name.to_owned(), Self::box_function_mut(function));
|
||||||
|
}
|
||||||
|
|
||||||
/// Add a metamethod which accepts a `&T` as the first parameter.
|
/// Add a metamethod which accepts a `&T` as the first parameter.
|
||||||
///
|
///
|
||||||
/// # Note
|
/// # Note
|
||||||
|
@ -175,6 +191,21 @@ impl<'lua, T: UserData> UserDataMethods<'lua, T> {
|
||||||
self.meta_methods.insert(meta, Self::box_function(function));
|
self.meta_methods.insert(meta, Self::box_function(function));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Add a metamethod as a mutable function which accepts generic arguments.
|
||||||
|
///
|
||||||
|
/// This is a version of [`add_meta_function`] that accepts a FnMut argument.
|
||||||
|
///
|
||||||
|
/// [`add_meta_function`]: #method.add_meta_function
|
||||||
|
pub fn add_meta_function_mut<A, R, F>(&mut self, meta: MetaMethod, function: F)
|
||||||
|
where
|
||||||
|
A: FromLuaMulti<'lua>,
|
||||||
|
R: ToLuaMulti<'lua>,
|
||||||
|
F: 'static + Send + FnMut(&'lua Lua, A) -> Result<R>,
|
||||||
|
{
|
||||||
|
self.meta_methods
|
||||||
|
.insert(meta, Self::box_function_mut(function));
|
||||||
|
}
|
||||||
|
|
||||||
fn box_function<A, R, F>(function: F) -> Callback<'lua, 'static>
|
fn box_function<A, R, F>(function: F) -> Callback<'lua, 'static>
|
||||||
where
|
where
|
||||||
A: FromLuaMulti<'lua>,
|
A: FromLuaMulti<'lua>,
|
||||||
|
@ -184,6 +215,21 @@ impl<'lua, T: UserData> UserDataMethods<'lua, T> {
|
||||||
Box::new(move |lua, args| function(lua, A::from_lua_multi(args, lua)?)?.to_lua_multi(lua))
|
Box::new(move |lua, args| function(lua, A::from_lua_multi(args, lua)?)?.to_lua_multi(lua))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn box_function_mut<A, R, F>(function: F) -> Callback<'lua, 'static>
|
||||||
|
where
|
||||||
|
A: FromLuaMulti<'lua>,
|
||||||
|
R: ToLuaMulti<'lua>,
|
||||||
|
F: 'static + Send + FnMut(&'lua Lua, A) -> Result<R>,
|
||||||
|
{
|
||||||
|
let function = RefCell::new(function);
|
||||||
|
Box::new(move |lua, args| {
|
||||||
|
let function = &mut *function
|
||||||
|
.try_borrow_mut()
|
||||||
|
.map_err(|_| Error::RecursiveMutCallback)?;
|
||||||
|
function(lua, A::from_lua_multi(args, lua)?)?.to_lua_multi(lua)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
fn box_method<A, R, M>(method: M) -> Callback<'lua, 'static>
|
fn box_method<A, R, M>(method: M) -> Callback<'lua, 'static>
|
||||||
where
|
where
|
||||||
A: FromLuaMulti<'lua>,
|
A: FromLuaMulti<'lua>,
|
||||||
|
|
Loading…
Reference in New Issue