use mlua::{Lua, Result as LuaResult};
pub fn register_all_apis(lua: &Lua) -> LuaResult<()> {
register_utility_apis(lua)?;
Ok(())
}
fn register_utility_apis(lua: &Lua) -> LuaResult<()> {
let globals = lua.globals();
let log_fn = lua.create_function(|_, message: String| {
tracing::info!("[Lua] {}", message);
Ok(())
})?;
globals.set("log", log_fn)?;
let log_warn_fn = lua.create_function(|_, message: String| {
tracing::warn!("[Lua] {}", message);
Ok(())
})?;
globals.set("log_warn", log_warn_fn)?;
let log_error_fn = lua.create_function(|_, message: String| {
tracing::error!("[Lua] {}", message);
Ok(())
})?;
globals.set("log_error", log_error_fn)?;
let random_fn = lua.create_function(|_, ()| {
use rand::Rng;
let mut rng = rand::thread_rng();
Ok(rng.gen::<f64>())
})?;
globals.set("random", random_fn)?;
let random_range_fn = lua.create_function(|_, (min, max): (f64, f64)| {
use rand::Rng;
let mut rng = rand::thread_rng();
Ok(rng.gen_range(min..max))
})?;
globals.set("random_range", random_range_fn)?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_log_api() {
let lua = Lua::new();
register_utility_apis(&lua).unwrap();
lua.load(r#"log("test message")"#).exec().unwrap();
lua.load(r#"log_warn("warning message")"#).exec().unwrap();
lua.load(r#"log_error("error message")"#).exec().unwrap();
}
#[test]
fn test_random_api() {
let lua = Lua::new();
register_utility_apis(&lua).unwrap();
let result: f64 = lua.load(r#"return random()"#).eval().unwrap();
assert!((0.0..1.0).contains(&result));
let result: f64 = lua
.load(r#"return random_range(10.0, 20.0)"#)
.eval()
.unwrap();
assert!((10.0..20.0).contains(&result));
}
#[test]
fn test_random_range_negative() {
let lua = Lua::new();
register_utility_apis(&lua).unwrap();
let result: f64 = lua
.load(r#"return random_range(-10.0, -5.0)"#)
.eval()
.unwrap();
assert!((-10.0..-5.0).contains(&result));
}
}