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