#![allow(clippy::uninlined_format_args)]
use thag_demo_proc_macros::DeriveBuilder;
#[derive(Debug, DeriveBuilder)]
#[expand_macro]
pub struct ServerConfig {
pub host: String,
pub port: u16,
pub timeout_ms: u64,
pub max_connections: u32,
pub enable_ssl: bool,
}
#[derive(Debug, DeriveBuilder)]
#[expand_macro]
pub struct DatabaseConfig {
pub url: String,
pub username: String,
pub password: String,
pub pool_size: u32,
}
#[derive(Debug, DeriveBuilder)]
#[expand_macro]
pub struct User {
pub id: u64,
pub name: String,
pub email: String,
pub is_admin: bool,
}
fn main() -> Result<(), String> {
println!("🏗️ Builder Pattern Demo");
println!("======================\n");
println!("1. Building a complete ServerConfig:");
let server_config = ServerConfig::builder()
.host("localhost".to_string())
.port(8080)
.timeout_ms(5000)
.max_connections(100)
.enable_ssl(false)
.build()?;
println!(" {:?}", server_config);
println!("\n2. Building DatabaseConfig with method chaining:");
let db_config = DatabaseConfig::builder()
.url("postgresql://localhost:5432/mydb".to_string())
.username("admin".to_string())
.password("secret123".to_string())
.pool_size(10)
.build()?;
println!(" {:?}", db_config);
println!("\n3. Building User object:");
let user = User::builder()
.id(12345)
.name("Alice Johnson".to_string())
.email("alice@example.com".to_string())
.is_admin(true)
.build()?;
println!(" {:?}", user);
println!("\n4. Demonstrating validation - missing required field:");
let incomplete_config = ServerConfig::builder()
.host("localhost".to_string())
.port(8080)
.build();
match incomplete_config {
Ok(_) => println!(" Unexpected success!"),
Err(e) => println!(" ✅ Caught expected error: {}", e),
}
println!("\n5. Using default builder constructor:");
let config_from_default = ServerConfigBuilder::default()
.host("0.0.0.0".to_string())
.port(443)
.timeout_ms(10000)
.max_connections(200)
.enable_ssl(true)
.build()?;
println!(" {:?}", config_from_default);
println!("\n6. Partial building and continuing:");
let partial_builder = User::builder().id(67890).name("Bob Smith".to_string());
let complete_user = partial_builder
.email("bob@example.com".to_string())
.is_admin(false)
.build()?;
println!(" {:?}", complete_user);
println!("\n7. Different ordering of method calls:");
let flexible_config = DatabaseConfig::builder()
.pool_size(5)
.password("another_secret".to_string())
.url("mysql://localhost:3306/testdb".to_string())
.username("test_user".to_string())
.build()?;
println!(" {:?}", flexible_config);
println!("\n🎉 Builder pattern demo completed successfully!");
println!("\nGenerated features demonstrated:");
println!(" - Fluent API with method chaining");
println!(" - Build-time validation with error messages");
println!(" - Default trait implementation");
println!(" - Flexible field ordering");
println!(" - Type safety and compile-time checking");
Ok(())
}