use crate::lua::{self, Result, Value, private::Sealed};
pub trait ToLua: Sized {
fn push_to_stack(self, state: &lua::State);
fn to_value(self, state: &lua::State) -> Value {
self.push_to_stack(state); Value::pop_from_stack(state)
}
}
pub trait FromLua: Sized {
fn try_from_stack(state: &lua::State, index: i32) -> Result<Self>;
fn try_from_value(value: Value, _: &lua::State) -> Result<Self> {
Self::try_from_stack(&value.thread(), value.index())
}
}
pub trait ToLuaMulti: Sized {
fn push_to_stack_multi(self, state: &lua::State) -> i32;
}
impl<T: ToLua> ToLuaMulti for T {
fn push_to_stack_multi(self, state: &lua::State) -> i32 {
self.push_to_stack(state);
1
}
}
pub trait FromLuaMulti: Sized {
fn try_from_stack_multi(
state: &lua::State,
start_index: i32,
count: i32,
) -> Result<(Self, i32)>;
}
impl<T: FromLua> FromLuaMulti for T {
fn try_from_stack_multi(state: &lua::State, start_index: i32, _: i32) -> Result<(Self, i32)> {
T::try_from_stack(state, start_index).map(|v| (v, 1))
}
}
pub trait ObjectLike: Sealed {
fn get<V: FromLua>(&self, state: &lua::State, key: impl ToLua) -> Result<V>;
fn set(&self, state: &lua::State, key: impl ToLua, value: impl ToLua) -> Result<()>;
fn call<R: FromLuaMulti>(
&self,
state: &lua::State,
name: &str,
args: impl ToLuaMulti,
) -> lua::Result<R>;
fn call_method<R: FromLuaMulti>(
&self,
state: &lua::State,
name: &str,
args: impl ToLuaMulti,
) -> lua::Result<R>;
}