Figura - template
A flexible and extensible template formatting engine for Rust that supports custom delimiters, alignment options, and pluggable directive parsers.
Features
- Flexible Delimiters: Use any characters as opening and closing delimiters (default:
{and}) - Alignment Support: Built-in support for left (
<), right (>), and center (^) alignment - Extensible Parser System: Create custom directive parsers for domain-specific templating needs
- Built-in Directives: Variable replacement and pattern repetition out of the box
- Escape Sequences: Support for escaping delimiters when needed
- Type Safety: Strong typing with clear error handling
Quick Start
Add this to your Cargo.toml:
[]
= "0.0.1"
Basic Usage
use ;
use HashMap;
>?;
// Create context with values
let mut context: Context = new;
context.insert;
context.insert;
// Format the template
let result = template.format?;
println!; // Output: Hello, Alice! You are 30 years old.
Ok
}
Core Concepts
Values
The engine supports three basic value types:
use Value;
let string_val = String;
let int_val = Int;
let bool_val = Bool;
Context
Context is a key-value map that provides data for template rendering:
use ;
use HashMap;
let mut ctx: Context = new;
ctx.insert;
ctx.insert;
ctx.insert;
Built-in Directives
Variable Replacement
Replace placeholders with context values:
let template = ', '}'>?;
Pattern Repetition
Repeat patterns a specified number of times:
// Repeat literal pattern
let template = ', '}'>?; // Outputs: *****
// Repeat using context values
let mut ctx = new;
ctx.insert;
ctx.insert;
let template = ', '}'>?; // Outputs: ---
Alignment
Control text alignment using alignment specifiers:
// Left alignment (default)
let template = ', '}'>?;
// Right alignment
let template = ', '}'>?;
// Center alignment
let template = ', '}'>?;
// Check detected alignment
println!;
Custom Delimiters
Use any characters as delimiters:
// Square brackets
let template = ?;
// Same character for both (useful for LaTeX-style)
let template = ', '|'>?;
Escape Sequences
Escape delimiters when you need literal characters:
// Double delimiters for escaping
let template = ', '}'>?;
// Outputs: {not a directive} but [value of this_is]
Custom Parsers
Create your own directive parsers for specialized templating needs:
use ;
;
;
// Usage
let template = ', '}'>?;
Advanced Examples
Complex Template with Multiple Features
use ;
use HashMap;
let template_str = r#"
=== User Report ===
Name: {name^}
Score: {stars:score} ({score}/5)
Status: {status}
{{Note: This is a literal brace}}
"#;
let template = ', '}'>?;
let mut context = new;
context.insert;
context.insert;
context.insert;
context.insert;
let result = template.format?;
println!;
Working with Different Data Types
// The engine automatically converts values to strings
let mut ctx = new;
ctx.insert;
ctx.insert;
ctx.insert;
let template = ', '}'>?;
// Output: Count: 42, Valid: true, Message: Hello
Performance Considerations
- Templates are parsed once and can be reused multiple times with different contexts
- The engine uses efficient string building and minimal allocations during formatting
- Consider caching parsed templates for frequently used patterns
Contributing
Contributions are welcome! Please feel free to submit issues, feature requests, or pull requests.
License
This project is licensed under the MIT License - see the LICENSE file for details.