use tron::{TronTemplateBuilder, TronRefBuilder, Result};
use std::collections::HashMap;
fn main() -> Result<()> {
println!("=== Tron Builder Patterns Example ===\n");
example_template_builder()?;
example_template_ref_builder()?;
example_bulk_operations()?;
example_method_chaining()?;
Ok(())
}
fn example_template_builder() -> Result<()> {
println!("1. Basic Template Builder:");
let template = TronTemplateBuilder::new()
.content("Hello @[greeting]@ @[name]@! Welcome to @[application]@.")
.set("greeting", "Hi")
.set("name", "Alice")
.set("application", "Tron Template Engine")
.build()?;
let result = template.render()?;
println!(" {}", result);
println!();
Ok(())
}
fn example_template_ref_builder() -> Result<()> {
println!("2. Template Reference Builder with Dependencies:");
let template_ref = TronRefBuilder::new()
.content(r#"
use @[serde_crate]@::{Serialize, Deserialize};
use @[uuid_crate]@::Uuid;
#[derive(Debug, Serialize, Deserialize)]
pub struct @[struct_name]@ {
pub id: Uuid,
@[fields]@
}
impl @[struct_name]@ {
pub fn new(@[constructor_params]@) -> Self {
Self {
id: Uuid::new_v4(),
@[field_assignments]@
}
}
}
"#)
.dependency("serde = { version = \"1.0\", features = [\"derive\"] }")
.dependency("uuid = { version = \"1.0\", features = [\"v4\"] }")
.set("serde_crate", "serde")
.set("uuid_crate", "uuid")
.set("struct_name", "User")
.set("fields", "pub name: String,\n pub email: String,")
.set("constructor_params", "name: String, email: String")
.set("field_assignments", "name,\n email,")
.build()?;
let result = template_ref.render()?;
println!("{}", result);
println!(" Dependencies: {:?}", template_ref.dependencies());
println!();
Ok(())
}
fn example_bulk_operations() -> Result<()> {
println!("3. Bulk Operations with HashMap:");
let mut values = HashMap::new();
values.insert("trait_name", "Display");
values.insert("type_name", "User");
values.insert("format_string", "{} <{}>\"");
values.insert("field_access", "self.name, self.email");
let template = TronTemplateBuilder::new()
.content(r#"impl std::fmt::@[trait_name]@ for @[type_name]@ {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "@[format_string]@, @[field_access]@)
}
}"#)
.set_many(values)
.build()?;
let result = template.render()?;
println!("{}", result);
Ok(())
}
fn example_method_chaining() -> Result<()> {
println!("4. Method Chaining Showcase:");
let module = TronRefBuilder::new()
.content(r#"//! @[module_doc]@
@[imports]@
@[main_content]@
#[cfg(test)]
mod tests {
use super::*;
@[tests]@
}
"#)
.dependencies(&[
"serde = \"1.0\"",
"tokio = { version = \"1.0\", features = [\"full\"] }",
"uuid = \"1.0\""
])
.set("module_doc", "User management module with async capabilities")
.set("imports", "use serde::{Serialize, Deserialize};\nuse uuid::Uuid;\nuse std::collections::HashMap;")
.set("main_content", r#"#[derive(Debug, Serialize, Deserialize)]
pub struct AsyncUser {
pub id: Uuid,
pub name: String,
pub metadata: HashMap<String, String>,
}
impl AsyncUser {
pub async fn save(&self) -> Result<(), Box<dyn std::error::Error>> {
// Simulate async database save
tokio::time::sleep(tokio::time::Duration::from_millis(100)).await;
println!("Saved user: {}", self.name);
Ok(())
}
}"#)
.set("tests", r#"#[tokio::test]
async fn test_user_save() {
let user = AsyncUser {
id: Uuid::new_v4(),
name: "Test User".to_string(),
metadata: HashMap::new(),
};
assert!(user.save().await.is_ok());
}"#)
.build()?;
let result = module.render()?;
println!("{}", result);
println!(" Dependencies used: {}", module.dependencies().len());
Ok(())
}