| Crates.io | figura |
| lib.rs | figura |
| version | 1.3.2 |
| created_at | 2025-06-21 13:04:47.941315+00 |
| updated_at | 2025-08-13 23:37:01.70621+00 |
| description | A flexible string template formatting crate |
| homepage | https://github.com/saverioscagnoli/figura |
| repository | https://github.com/saverioscagnoli/figura |
| max_upload_size | |
| id | 1720796 |
| size | 79,604 |
A lightweight, flexible template formatting engine for Rust with support for custom delimiters and extensible directive parsing.
{name} → context values{pattern:count} → repeat patterns{condition?true_part:false_part} → conditional rendering{{ and }} for literal delimiters{value<}, {value>}, {value^} for formatting hintsuse figura::{Template, Context, Value};
use std::collections::HashMap;
// Basic variable substitution
let template = Template::parse("Hello, {name}!")?;
let mut ctx = HashMap::new();
ctx.insert("name", Value::String("World".into()));
assert_eq!(template.format(&ctx)?, "Hello, World!");
// Repetition
let template = Template::parse("Echo: {word:3}")?;
let mut ctx = HashMap::new();
ctx.insert("word", Value::String("hi".into()));
assert_eq!(template.format(&ctx)?, "Echo: hihihi");
// Conditionals
let template = Template::parse("{logged_in?Welcome back!:Please log in}")?;
let mut ctx = HashMap::new();
ctx.insert("logged_in", Value::Bool(true));
assert_eq!(template.format(&ctx)?, "Welcome back!");
// Custom delimiters
let template = Template::<'[', ']'>::parse("Hello [name]!")?;
The engine supports multiple value types:
ctx.insert("name", Value::String("Alice".into()));
ctx.insert("age", Value::Int(30));
ctx.insert("score", Value::Float(95.5));
ctx.insert("active", Value::Bool(true));
Extend functionality by implementing the Parser trait:
struct CustomParser;
impl Parser for CustomParser {
fn parse(tokens: &[Token], content: &str) -> Option<Box<dyn Directive>> {
// Your custom parsing logic
// Fall back to DefaultParser if needed
DefaultParser::parse(tokens, content)
}
}
let template = Template::with_parser::<CustomParser>("Your template")?;
The engine provides detailed error information:
MissingDelimiter: Unmatched template delimitersNoValueFound: Referenced variable not in contextExecutionError: Runtime directive execution failuresDirectiveParsing: Parser unable to handle directiveMIT