mirror of
https://github.com/lune-org/mlua-luau-scheduler.git
synced 2025-04-10 21:40:55 +01:00
41 lines
1.1 KiB
Rust
41 lines
1.1 KiB
Rust
use mlua::prelude::*;
|
|
|
|
use crate::{Message, MessageSender, ThreadId};
|
|
|
|
pub fn create_lua(lua_tx: MessageSender, async_tx: MessageSender) -> LuaResult<Lua> {
|
|
let lua = Lua::new();
|
|
lua.enable_jit(true);
|
|
lua.set_app_data(async_tx.clone());
|
|
|
|
// Cancellation
|
|
let cancel_tx = lua_tx.clone();
|
|
lua.globals().set(
|
|
"__scheduler__cancel",
|
|
LuaFunction::wrap(move |_, thread: LuaThread| {
|
|
let thread_id = ThreadId::from(thread);
|
|
cancel_tx.send(Message::Cancel(thread_id)).into_lua_err()
|
|
}),
|
|
)?;
|
|
|
|
// Stdout
|
|
let stdout_tx = async_tx.clone();
|
|
lua.globals().set(
|
|
"__scheduler__writeStdout",
|
|
LuaFunction::wrap(move |_, s: LuaString| {
|
|
let bytes = s.as_bytes().to_vec();
|
|
stdout_tx.send(Message::WriteStdout(bytes)).into_lua_err()
|
|
}),
|
|
)?;
|
|
|
|
// Stderr
|
|
let stderr_tx = async_tx.clone();
|
|
lua.globals().set(
|
|
"__scheduler__writeStderr",
|
|
LuaFunction::wrap(move |_, s: LuaString| {
|
|
let bytes = s.as_bytes().to_vec();
|
|
stderr_tx.send(Message::WriteStderr(bytes)).into_lua_err()
|
|
}),
|
|
)?;
|
|
|
|
Ok(lua)
|
|
}
|