ignis-db 0.2.0

A comprehensive PostgreSQL ORM with macro-driven schema management
Documentation
use ignis_db::introspection::DatabaseIntrospector;
use ignis_db::migrate::SchemaMigrationManager;
use std::collections::HashMap;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    println!("๐Ÿงช Testing Schema Diff with New Object Types");
    
    // Connect to database
    let pool = sqlx::PgPool::connect("postgresql://postgres:postgres@localhost:5433/postgres").await?;
    let introspector = DatabaseIntrospector::new(pool.clone());
    
    // Introspect current state
    println!("๐Ÿ” Introspecting current database state...");
    let current_tables = introspector.introspect_tables().await?;
    let current_views = introspector.introspect_views().await?;
    let current_composite_types = introspector.introspect_composite_types().await?;
    let current_indexes = introspector.introspect_indexes().await?;
    let current_functions = introspector.introspect_functions().await?;
    let current_procedures = introspector.introspect_procedures().await?;
    let current_triggers = introspector.introspect_triggers().await?;
    
    println!("๐Ÿ“Š Current state:");
    println!("  โ€ข Tables: {}", current_tables.len());
    println!("  โ€ข Views: {}", current_views.len());
    println!("  โ€ข Composite Types: {}", current_composite_types.len());
    println!("  โ€ข Indexes: {}", current_indexes.len());
    println!("  โ€ข Functions: {}", current_functions.len());
    println!("  โ€ข Procedures: {}", current_procedures.len());
    println!("  โ€ข Triggers: {}", current_triggers.len());
    
    // Create a "new" state that's identical to current (should detect no changes)
    println!("\n๐Ÿ” Testing schema diff with identical states...");
    let manager = SchemaMigrationManager::new(pool)
        .set_old_tables(current_tables.clone().into_iter().map(|t| (t.name.clone(), t)).collect())
        .set_new_tables(current_tables.clone().into_iter().map(|t| (t.name.clone(), t)).collect())
        .set_old_views(current_views.clone().into_iter().map(|v| (v.name.clone(), v)).collect())
        .set_new_views(current_views.clone().into_iter().map(|v| (v.name.clone(), v)).collect())
        .set_old_composite_types(current_composite_types.clone().into_iter().map(|ct| (ct.name.clone(), ct)).collect())
        .set_new_composite_types(current_composite_types.clone().into_iter().map(|ct| (ct.name.clone(), ct)).collect())
        .set_old_indexes(current_indexes.clone().into_iter().map(|i| (i.name.clone(), i)).collect())
        .set_new_indexes(current_indexes.clone().into_iter().map(|i| (i.name.clone(), i)).collect())
        .set_old_functions(current_functions.clone().into_iter().map(|f| (f.name.clone(), f)).collect())
        .set_new_functions(current_functions.clone().into_iter().map(|f| (f.name.clone(), f)).collect())
        .set_old_procedures(current_procedures.clone().into_iter().map(|p| (p.name.clone(), p)).collect())
        .set_new_procedures(current_procedures.clone().into_iter().map(|p| (p.name.clone(), p)).collect())
        .set_old_triggers(current_triggers.clone().into_iter().map(|t| (t.name.clone(), t)).collect())
        .set_new_triggers(current_triggers.clone().into_iter().map(|t| (t.name.clone(), t)).collect());
    
    // This should detect no changes
    match manager.generate_migration("test_no_changes") {
        Ok(_) => println!("โŒ Expected error for no changes, but got success"),
        Err(e) => {
            if e.to_string().contains("No schema changes detected") {
                println!("โœ… Correctly detected no schema changes");
            } else {
                println!("โŒ Unexpected error: {}", e);
            }
        }
    }
    
    println!("\n๐ŸŽ‰ Schema diff test completed!");
    Ok(())
}