Lightweight string template engine with variables, conditionals, and loops
cargo add philiprehberger-templateLightweight string template engine with variables, conditionals, and loops
[dependencies]
philiprehberger-template = "0.2.2"
use philiprehberger_template::{Template, Value};
use std::collections::HashMap;
let tpl = Template::parse("Hello, {name}!").unwrap();
let mut data = HashMap::new();
data.insert("name".into(), Value::from("world"));
assert_eq!(tpl.render(&data).unwrap(), "Hello, world!");
use philiprehberger_template::{Template, Value};
use std::collections::HashMap;
let tpl = Template::parse("Email: {user.email}").unwrap();
let mut user = HashMap::new();
user.insert("email".into(), Value::from("a@b.com"));
let mut data = HashMap::new();
data.insert("user".into(), Value::Map(user));
assert_eq!(tpl.render(&data).unwrap(), "Email: a@b.com");
use philiprehberger_template::{Template, Value};
use std::collections::HashMap;
let tpl = Template::parse("{#if logged_in}Welcome back!{/if}").unwrap();
let mut data = HashMap::new();
data.insert("logged_in".into(), Value::from(true));
assert_eq!(tpl.render(&data).unwrap(), "Welcome back!");
use philiprehberger_template::{Template, Value};
use std::collections::HashMap;
let tpl = Template::parse("{#each items}{.}, {/each}").unwrap();
let mut data = HashMap::new();
data.insert("items".into(), Value::List(vec![
Value::from("a"), Value::from("b"), Value::from("c"),
]));
assert_eq!(tpl.render(&data).unwrap(), "a, b, c, ");
use philiprehberger_template::Value;
let val = Value::from("hello");
assert_eq!(val.as_str(), Some("hello"));
assert!(val.is_string());
assert!(!val.is_number());
let num = Value::from(42.0);
assert_eq!(num.as_f64(), Some(42.0));
use philiprehberger_template::{Template, Value};
use std::collections::HashMap;
let tpl = Template::parse("{name|upper}").unwrap();
let mut data = HashMap::new();
data.insert("name".into(), Value::from("hello"));
assert_eq!(tpl.render(&data).unwrap(), "HELLO");
| Item | Description |
|---|---|
Template::parse(s) | Parse a template string, returns Result<Template, ParseError> |
template.render(&data) | Render with data, returns Result<String, RenderError> |
Value | Enum: String, Number, Bool, List, Map |
Value::as_str() | Get &str if String |
Value::as_f64() | Get f64 if Number |
Value::as_bool() | Get bool if Bool |
Value::as_list() | Get &[Value] if List |
Value::as_map() | Get &HashMap if Map |
Value::is_string() etc. | Type check methods |
{name} | Variable placeholder |
{user.email} | Dot-notation nested access |
{#if cond}...{/if} | Conditional block |
{#if !cond}...{/if} | Negated conditional |
{#each list}...{/each} | Loop block ({.} for current item) |
{name|filter} | Filters: upper, lower, trim |
{{ | Escaped literal { |
cargo test
cargo clippy -- -D warnings
If you find this project useful: