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
  • [“std”]
    • Enables standard library
    • Uses ahash::HashMap for faster lookups
  • [“serde”]
    • Adds serialization capabilities
    • Enables template storage/transmission
  • [“bincode”]
    • Efficient binary serialization
  • [“toml”]
    • Enables ResolverError::{DecodeTomlError, EncodeTomlError}

§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 = selector_msg.try_into()?;

  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::{error::ResolverResult, TemplateResolver};

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

  // dbg!(&resolver);

  let ctx = [("name", "Alice")];

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

Re-exports§

pub use error::ResolverError as Error;
pub use error::ResolverResult as Result;
pub use resolver::TemplateResolver;

Modules§

error
resolver

Enums§

Template
Core template representation

Type Aliases§

ContextMapstd
ContextMapBufstd