derive-defs 0.0.8

Library for generating derive preset macros from TOML configuration
Documentation
//! Basic example: Simple derive presets.
//!
//! This example demonstrates basic usage of derive-defs with a simple
//! TOML configuration file.
//!
//! # Running the example
//!
//! ```bash
//! cargo run --example basic
//! ```

use std::fs;

fn main() {
    println!("Basic Derive Definitions Example");
    println!();

    // Create a temporary TOML configuration
    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")]']
"#;

    // Write to a temporary file
    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!();

    // Parse the configuration
    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!();

    // Resolve inheritance
    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!();

    // Generate code to a temporary file
    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}");

    // Cleanup
    let _ = fs::remove_file(&config_path);
    let _ = fs::remove_file(&output_path);

    println!();
    println!("Example completed successfully!");
}