luau 0.732.0

Safe lifetime-bound Rust embedding API for the Luau runtime
use luau::{Error, InterruptAction, InterruptHooks, InterruptMode, Lua};

fn main() -> luau::Result<()> {
    let mut lua = Lua::new()?;
    let interrupt = lua.interrupt_handle();

    lua.set_interrupt_handler(
        InterruptHooks::new()
            .set_mode(InterruptMode::Requested)
            .on_execution(|_| Ok(InterruptAction::Break)),
    );

    let result: Result<(), _> = {
        let function = lua
            .load(
                r#"
            local value = 0
            while true do
                value += 1
            end
            "#,
            )
            .set_name("execution_interrupt")
            .into_function()?;
        let thread = lua.create_thread(function)?;
        let request = std::thread::spawn(move || interrupt.request());
        let result = thread.resume(());
        request
            .join()
            .expect("interrupt request thread should complete");
        result
    };
    lua.remove_interrupt_handler();

    match result {
        Ok(_) => {
            return Err(Error::runtime("script completed without interruption"));
        }
        Err(Error::Interrupted) => {}
        Err(error) => return Err(error),
    }

    println!("execution interrupted");
    Ok(())
}