A deterministic Tera-style template engine for MoonBit
moon add btlqql/moon_tera@0.3.0import {
"btlqql/moon_tera" @tera,
}let engine = @tera.Tera::new()
engine.add_template("hello", "Hello {{ name | upper }}!")
let context = @tera.object_value([
("name", @tera.str_value("MoonBit")),
])
match engine.try_render("hello", context) {
Ok(output) => println(output)
Err(error) => println(error.message())
}match engine.validate() {
Ok(()) => println("template registry is valid")
Err(error) => println(error.message())
}moon run cmd/main --target js<main><h1>MOON TERA</h1><p>deterministic output</p><p>portable MoonBit core</p></main>moon fmt --check
moon check --deny-warn
moon build --target all --deny-warn
moon test --target all --deny-warn
moon run cmd/main --target js| Path | Responsibility |
|---|---|
| value.mbt | Ordered dynamic values and deterministic JSON encoding |
| lexer.mbt, token.mbt | Template-level tokenization |
| expr.mbt | Expression lexer and Pratt parser |
| parser.mbt, ast.mbt | Template parser and AST |
| vm.mbt | AST evaluator |
| filters.mbt, is_tests.mbt | Built-in filters and tests |
| tera.mbt, error.mbt | Template registry, inheritance, validation, diagnostics |
| cmd/main | Runnable integration example |
pub(all) enum ExprToken {
EIdent(String)
EInt(Int)
EStr(String)
EOp(String)
EDot
ELparen
ERparen
ELbracket
ERbracket
EComma
EPipe
EEof
} derive(Debug)A deterministic Tera-style template engine for MoonBit