use anyhow::Result; use rusqlite::Connection; use std::env; use sts::{Config, MigrationRunner}; fn main() -> Result<()> { let args: Vec = env::args().collect(); if args.len() < 2 { print_usage(); return Ok(()); } let config = Config::from_env(); let conn = Connection::open(&config.database_path)?; let runner = MigrationRunner::new(&conn)?; match args[1].as_str() { "up" => { println!("Running migrations..."); runner.run_migrations()?; } "status" => { runner.show_migration_status()?; } "rollback" => { if args.len() < 3 { eprintln!("Error: rollback requires a version number"); eprintln!("Usage: cargo run --bin migrate rollback "); return Ok(()); } let version: i64 = args[2] .parse() .map_err(|_| anyhow::anyhow!("Invalid version number: {}", args[2]))?; runner.rollback_to_version(version)?; } _ => { eprintln!("Error: Unknown command '{}'", args[1]); print_usage(); } } Ok(()) } fn print_usage() { println!("OAuth2 STS Migration Tool"); println!("========================"); println!(""); println!("Usage:"); println!(" cargo run --bin migrate up # Run pending migrations"); println!(" cargo run --bin migrate status # Show migration status"); println!(" cargo run --bin migrate rollback # Rollback to timestamp"); println!(""); println!("Environment Variables:"); println!(" DATABASE_PATH Path to SQLite database (default: oauth.db)"); println!(""); println!("Examples:"); println!(" cargo run --bin migrate up"); println!(" cargo run --bin migrate status"); println!(" cargo run --bin migrate rollback 20231201120000"); }