migratex 0.2.2

Agnostic migration toolkit library.
Documentation
mod context;
mod migrations;

use std::sync::Arc;

use migratex::{Metadata, Migratex, SqliteMetadata, SqliteStorage, connect_to_sqlite};
use okerr::Result;
use sqlx::SqlitePool;

use context::MigContext;
use migrations::migrations;

#[tokio::main]
async fn main() -> Result<()> {
    let db_file = "app.db";

    // Connect to SQLite database
    let pool = connect_to_sqlite(db_file.into()).await?;
    migrate(&pool, db_file).await?;

    Ok(())
}

// Update DB (eventually: + filesystem migrations + other migrations here...)
// Migrations up → latest
async fn migrate(pool: &SqlitePool, db_file: &str) -> Result<()> {
    println!("=== Migratex SQLx Example ===\n");
    println!("Database file: {}\n", db_file);

    let storage = SqliteStorage::new(Arc::new(pool.clone()));

    println!("✓ Connected to database {}\n", db_file);

    // Load or initialize metadata using SqliteMetadata
    let mut meta = SqliteMetadata::load_or_init(&storage).await?;

    let initial_version = meta.version();

    println!("Initial metadata:");
    println!("  Version: {}", meta.version());
    println!("  Status: {:?}", meta.status());
    println!("  App version: {}", meta.app_version());
    println!("  Created at: {}", meta.created_at());
    println!("  Updated at: {}\n", meta.updated_at());

    // Create migration context with the pool
    let mut ctx = MigContext::new(storage.pool.clone());

    // Load migrations and create Migratex (migration manager)
    let migs = migrations();
    let mut mx = Migratex::new(&mut ctx, &mut meta, migs);

    println!("Latest migration version: {}\n", mx.latest_version());

    // Run migrations to latest version
    println!("Running migrations...\n");

    mx.migrate_to_latest().await?;

    println!("\nFinal metadata:");
    println!("  Version: {}", meta.version());
    println!("  Status: {:?}", meta.status());
    println!("  App version: {}", meta.app_version());
    println!("  Updated at: {}\n", meta.updated_at());

    // Save metadata to database
    meta.save(&storage).await?;

    println!("\n=== Migration Complete ===");

    if meta.version() == initial_version {
        println!("✓ Nothing to migrate");
    } else {
        println!("✓ Metadata saved to database");
    }

    println!("\nYou can inspect the database:");
    println!(r#"  sqlite3 "{}""#, db_file);
    println!("  .tables");
    println!("  SELECT * FROM _migratex_metadata;");
    println!("  .schema users");
    println!("  .schema subscriptions");
    println!("  .schema products");

    Ok(())
}