use rlua::prelude::*;
use rlua::{Variadic, Value};
pub fn init(lua: &Lua) -> crate::Result<()> {
fn tostr (lua: &Lua, args: Variadic<Value>) -> LuaResult<String> {
let f: LuaFunction = lua.globals().get("tostring")?;
let mut s = String::new();
for value in args.into_iter() {
let vs: String = f.call(value)?;
s.push('\t');
s.push_str(&vs);
}
Ok(s)
}
let module = lua.create_table()?;
module.set("error", lua.create_function( |lua, args: _| {
error!("{}", tostr(lua, args)?);
Ok(())
})? )?;
module.set("warn", lua.create_function( |lua, args: _| {
warn!("{}", tostr(lua, args)?);
Ok(())
})? )?;
module.set("info", lua.create_function( |lua, args: _| {
info!("{}", tostr(lua, args)?);
Ok(())
})? )?;
module.set("debug", lua.create_function( |lua, args: _| {
debug!("{}", tostr(lua, args)?);
Ok(())
})? )?;
module.set("trace", lua.create_function( |lua, args: _| {
trace!("{}", tostr(lua, args)?);
Ok(())
})? )?;
lua.globals().set("_log", module)?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn lua_log () {
let colors = ::fern::colors::ColoredLevelConfig::new();
::fern::Dispatch::new()
.format(move |out, message, record| {
out.finish(format_args!(
"{}: {}", colors.color(record.level()), message
))
})
.level(::log::LevelFilter::Trace)
.chain(::std::io::stdout())
.apply().unwrap();
let lua = Lua::new();
init(&lua).unwrap();
lua.exec::<_, ()>(r#"
_log.info(4, "foo", nil, {})
_log.error("Some Scary Error")
_log.warn("Warning")
_log.debug("Debug")
_log.trace("Trace", "with", {}, "data")
"#, None).unwrap();
}
}