use futures_lite::StreamExt;
use mlua::prelude::*;
use tracing::instrument;
#[instrument(level = "trace", name = "Scheduler::run_until_yield", skip_all)]
pub(crate) async fn run_until_yield(
thread: LuaThread,
args: LuaMultiValue,
) -> Option<LuaResult<LuaMultiValue>> {
let mut stream = thread.into_async(args).expect("thread must be resumable");
stream.next().await
}
#[inline]
pub(crate) fn is_poll_pending(value: &LuaValue) -> bool {
value
.as_light_userdata()
.is_some_and(|l| l == Lua::poll_pending())
}
#[derive(Clone)]
pub(crate) enum LuaThreadOrFunction {
Thread(LuaThread),
Function(LuaFunction),
}
impl LuaThreadOrFunction {
pub(super) fn into_thread(self, lua: &Lua) -> LuaResult<LuaThread> {
match self {
Self::Thread(t) => Ok(t),
Self::Function(f) => lua.create_thread(f),
}
}
}
impl FromLua for LuaThreadOrFunction {
fn from_lua(value: LuaValue, _: &Lua) -> LuaResult<Self> {
match value {
LuaValue::Thread(t) => Ok(Self::Thread(t)),
LuaValue::Function(f) => Ok(Self::Function(f)),
value => Err(LuaError::FromLuaConversionError {
from: value.type_name(),
to: "LuaThreadOrFunction".to_string(),
message: Some("Expected thread or function".to_string()),
}),
}
}
}