Skip to main content

minijinja_lua/
lib.rs

1// SPDX-License-Identifier: MIT
2
3pub mod contrib;
4mod convert;
5mod environment;
6mod state;
7
8use mlua::prelude::{Lua, LuaFunction, LuaResult, LuaTable, LuaValue};
9
10pub use crate::environment::LuaEnvironment;
11
12/// Builds and returns the `minijinja` lua table.
13///
14/// The returned table has the following keys:
15///
16/// - [`Environment`](LuaEnvironment): `userdata` provides access to a [`minijinja::Environment`]
17/// - [`None`](mlua::Value::NULL): a nil-like `lightuserdata` that can be used without the downsides
18///   of `nil`. It maps to [`minijinja::value::ValueKind::None`]
19/// - `path_loader()`: creates a callback function which can be passed to `Environment:set_loader()`
20///   to load templates from the filesystem.
21/// - `type()`: a function to return types for minijinja-lua objects.
22#[cfg_attr(feature = "module", mlua::lua_module(name = "minijinja"))]
23pub fn minijinja_lua(lua: &Lua) -> LuaResult<LuaTable> {
24    let table = lua.create_table()?;
25
26    table.set(
27        "type",
28        lua.create_function(|_, val: LuaValue| contrib::minijinja_types(&val))?,
29    )?;
30
31    let path_loader = contrib::minijinja_path_loader(lua)?;
32    table.set(
33        "path_loader",
34        lua.create_function(move |_, val: LuaValue| -> Result<LuaFunction, _> {
35            path_loader.call(val)
36        })?,
37    )?;
38
39    table.set("None", LuaValue::NULL)?;
40    table.set("Environment", lua.create_proxy::<LuaEnvironment>()?)?;
41
42    Ok(table)
43}