use mlua::prelude::*;
pub fn register_time_api(lua: &Lua) -> Result<(), LuaError> {
crate::api_table::register_protected(lua, "time", |time_table| {
time_table.raw_set("_dt", 0.0f32)?;
time_table.raw_set("_elapsed", 0.0f32)?;
time_table.raw_set("_fps", 60.0f32)?;
lua.load(
r#"
function time.dt()
return time._dt
end
function time.elapsed()
return time._elapsed
end
function time.fps()
return time._fps
end
"#,
)
.exec()?;
Ok(())
})
}
pub fn update_time_api(lua: &Lua, dt: f32, elapsed: f32, fps: f32) -> Result<(), LuaError> {
let time_table = crate::api_table::raw(lua, "time")?;
time_table.raw_set("_dt", dt)?;
time_table.raw_set("_elapsed", elapsed)?;
time_table.raw_set("_fps", fps)?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use mlua::Lua;
fn eval_f32(lua: &Lua, expr: &str) -> f32 {
lua.load(format!("return {expr}")).eval().unwrap()
}
#[test]
fn defaults_after_register() {
let lua = Lua::new();
register_time_api(&lua).unwrap();
assert_eq!(eval_f32(&lua, "time.dt()"), 0.0);
assert_eq!(eval_f32(&lua, "time.elapsed()"), 0.0);
assert_eq!(eval_f32(&lua, "time.fps()"), 60.0);
}
#[test]
fn update_reflects_and_overwrites() {
let lua = Lua::new();
register_time_api(&lua).unwrap();
update_time_api(&lua, 0.016, 1.5, 62.5).unwrap();
assert!((eval_f32(&lua, "time.dt()") - 0.016).abs() < 1e-6);
assert!((eval_f32(&lua, "time.elapsed()") - 1.5).abs() < 1e-6);
assert!((eval_f32(&lua, "time.fps()") - 62.5).abs() < 1e-6);
update_time_api(&lua, 0.033, 9.0, 30.0).unwrap();
assert!((eval_f32(&lua, "time.dt()") - 0.033).abs() < 1e-6);
assert!((eval_f32(&lua, "time.elapsed()") - 9.0).abs() < 1e-6);
assert!((eval_f32(&lua, "time.fps()") - 30.0).abs() < 1e-6);
}
}