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(())
}