Crate tmpl_resolver

Source
Expand description

§tmpl_resolver

A lightweight template resolution engine with conditional logic support.

§Key Concepts

  • Templates: Contain either direct text parts or conditional selectors
  • Selectors: Enable branch logic based on parameter values
  • Variable Resolution: Recursive resolution with context-aware lookup

§Features

  • []
    • Minimal configuration for no_std use
  • [“all”]: Enable all features
  • [“std”]
    • Enables standard library
    • Uses ahash::HashMap for faster lookups
  • [“serde”]
    • Adds serialization capabilities
    • Enables template storage/transmission
  • [“bincode”]
    • Efficient binary serialization

§Examples

§Basic

use tmpl_resolver::{TemplateResolver, error::ResolverResult};

fn main() -> ResolverResult<()> {
  let resolver: TemplateResolver = [
      ("h", "Hello"),
      ("greeting", "{h} { $name }! Today is {$day}")
    ]
    .try_into()?;

  let result = resolver.get_with_context("greeting", &[("name", "Alice"), ("day", "Monday")])?;
  assert_eq!(result, "Hello Alice! Today is Monday");
  Ok(())
}

§Conditional Logic

use tmpl_resolver::{TemplateResolver, error::ResolverResult};

fn main() -> ResolverResult<()> {
  let selector_msg = [(
    "message",
    r#"$status ->
      [success] Operation succeeded!
      [error] Error occurred!
      *[default] Unknown status: {$status}
    "#
  )];

  let resolver = TemplateResolver::from_raw_slice(&selector_msg)?;

  let success_msg = resolver.get_with_context("message", &[("status", "success")])?;

  assert_eq!(success_msg, "Operation succeeded!");
  Ok(())
}

§Escape

  • "{{ a }}" => "a"
  • "{{{a}}}" => "a"
  • "{{{{ a }}}}" => "a"
  • "{{ {a} }}" => "{a}"
  • "{{a}" => ❌ nom Error, code: take_until
  • "{{{ {{a}} }}}" => "{{a}}"
  • "{{{ {{ a }} }}}" => "{{ a }}"
  • "{{{ {{a} }}}" => "{{a}"
use tmpl_resolver::{ResolverResult, TemplateResolver};

fn main() -> ResolverResult<()> {
  let resolver: TemplateResolver = [
    ("h", "Hello { $name }"),
    ("greeting", "{h}!{{ how_are_you }}? {{{    {{$name}}  }}}"),
  ]
  .try_into()?;

  let ctx = [("name", "Alice"), ("how_are_you", "How are you")];

  let result = resolver.get_with_context("greeting", &ctx)?;
  assert_eq!(result, "Hello Alice!how_are_you? {{$name}}");
  Ok(())
}

Re-exports§

pub use error::ResolverResult;
pub use resolver::TemplateResolver;

Modules§

error
resolver

Type Aliases§

ContextMapstd