use std::fs;
fn main() {
println!("Basic Derive Definitions Example");
println!();
let config = r#"
[defs.debug]
traits = ["Debug"]
[defs.model]
extends = "debug"
traits = ["Clone", "PartialEq"]
[defs.entity]
extends = "model"
traits = ["Serialize", "Deserialize"]
attrs = ['#[serde(rename_all = "camelCase")]']
"#;
let temp_dir = std::env::temp_dir();
let config_path = temp_dir.join("derive_defs_basic_example.toml");
fs::write(&config_path, config).expect("Failed to write config");
println!("Configuration file:");
println!("{config}");
println!();
let parsed = derive_defs::parser::parse_file(&config_path).expect("Failed to parse");
println!("Parsed {} definitions:", parsed.defs.len());
for name in parsed.defs.keys() {
println!(" - {name}");
}
println!();
let resolved = derive_defs::resolver::resolve(&parsed).expect("Failed to resolve");
println!("Resolved definitions:");
for (name, def) in &resolved.defs {
println!(" {name}:");
println!(" traits: {:?}", def.traits);
if !def.attrs.is_empty() {
println!(" attrs: {:?}", def.attrs);
}
}
println!();
let output_path = temp_dir.join("derive_defs_basic_output.rs");
derive_defs::generate_from_resolved(resolved, &output_path).expect("Failed to generate");
println!("Generated code saved to: {}", output_path.display());
println!();
println!("Generated code:");
let generated = fs::read_to_string(&output_path).expect("Failed to read output");
println!("{generated}");
let _ = fs::remove_file(&config_path);
let _ = fs::remove_file(&output_path);
println!();
println!("Example completed successfully!");
}