Skip to main content

minijinja_lua/
lib.rs

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