summaryrefslogtreecommitdiff
path: root/src/config/evalsto.rs
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2024-08-01 20:13:55 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2024-08-01 20:13:55 +0200
commita807d4e6fb96c4d8b8585b7dbb862e53486562ec (patch)
tree92481d73423fd925f4dd034d68cbfd2e30e216d5 /src/config/evalsto.rs
parent417cee4eeeaf7516dfeb59cdbe34fed18f30e0f7 (diff)
add evalsto
Diffstat (limited to 'src/config/evalsto.rs')
-rw-r--r--src/config/evalsto.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/config/evalsto.rs b/src/config/evalsto.rs
new file mode 100644
index 0000000..10b2dd1
--- /dev/null
+++ b/src/config/evalsto.rs
@@ -0,0 +1,64 @@
+use std::{marker::PhantomData, sync::Arc};
+
+use mlua::{FromLua, IntoLua, Lua, Result, Value};
+
+use crate::lua::ownedfunction::OwnedFunction;
+
+#[derive(Clone, Debug)]
+pub enum EvalTo<T, A> {
+ Function(Arc<OwnedFunction>, PhantomData<A>),
+ Value(T),
+}
+
+impl<T, A> EvalTo<T, A> {
+ pub fn get<'lua>(&'lua self, args: A, lua: &'lua Lua) -> Result<T>
+ where
+ T: FromLua<'lua> + Clone,
+ A: IntoLua<'lua>,
+ {
+ match self {
+ EvalTo::Function(value, _) => {
+ let func = value.get(lua);
+ T::from_lua(func.call(args)?, lua)
+ }
+ EvalTo::Value(value) => Ok(value.clone()),
+ }
+ }
+
+ pub const fn new(value: T) -> Self {
+ Self::Value(value)
+ }
+}
+
+impl<'lua, T, A> FromLua<'lua> for EvalTo<T, A>
+where
+ T: FromLua<'lua> + Clone,
+ A: IntoLua<'lua>,
+{
+ fn from_lua(
+ value: mlua::prelude::LuaValue<'lua>,
+ lua: &'lua mlua::prelude::Lua,
+ ) -> Result<Self> {
+ if value.is_function() {
+ Ok(Self::Function(
+ Arc::new(OwnedFunction::new(value, lua)),
+ PhantomData,
+ ))
+ } else {
+ Ok(Self::Value(T::from_lua(value, lua)?))
+ }
+ }
+}
+
+impl<'lua, T, A> IntoLua<'lua> for EvalTo<T, A>
+where
+ T: FromLua<'lua> + Clone + IntoLua<'lua>,
+ A: IntoLua<'lua>,
+{
+ fn into_lua(self, lua: &'lua mlua::prelude::Lua) -> Result<Value<'lua>> {
+ match self {
+ EvalTo::Function(value, _) => Ok(value.get(lua).into_lua(lua)?),
+ EvalTo::Value(value) => value.into_lua(lua),
+ }
+ }
+}