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