1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
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(); } }