use std::fs;
fn main() {
println!("Code Generation Example");
println!("=======================");
println!();
let config = r#"
# Serialization bundle for API types
[defs.serialization]
traits = ["Clone", "Serialize", "Deserialize"]
attrs = [
'#[serde(rename_all = "camelCase")]',
]
# Model bundle for domain types
[defs.model]
traits = ["Debug", "Clone", "PartialEq"]
# Entity bundle for database types
[defs.entity]
extends = "model"
traits = ["Serialize", "Deserialize"]
attrs = [
'#[serde(rename_all = "camelCase")]',
'#[serde(default)]',
]
# Value object bundle (immutable, comparable)
[defs.value_object]
extends = "model"
traits = ["Eq", "Hash", "Copy"]
# Event bundle for domain events
[defs.event]
extends = "serialization"
traits = ["Debug", "Hash", "Eq"]
"#;
let temp_dir = std::env::temp_dir();
let config_path = temp_dir.join("derive_defs_codegen_example.toml");
fs::write(&config_path, config).expect("Failed to write config");
println!("Configuration:");
println!("{config}");
println!();
let parsed = derive_defs::parser::parse_file(&config_path).expect("Failed to parse");
let resolved = derive_defs::resolver::resolve(&parsed).expect("Failed to resolve");
let output_path = temp_dir.join("derive_defs_codegen_output.rs");
derive_defs::generate_from_resolved(resolved, &output_path).expect("Failed to generate");
println!("Generated proc-macro code:");
println!("---");
let generated = fs::read_to_string(&output_path).expect("Failed to read output");
println!("{generated}");
println!("---");
println!();
println!("This generated code can be used in a proc-macro crate.");
println!("Each function is a proc_macro_attribute that applies");
println!("the configured derives and attributes to the input item.");
let _ = fs::remove_file(&config_path);
let _ = fs::remove_file(&output_path);
}