use crate::config::Config; use crate::database::{DatabaseConnection, PostgresConnection}; use crate::error::{ErrorKind, StdResult}; use crate::migration::{filter_pending_migrations, Migration, MigrationManager, MigrationNames}; const EM_DASH: char = '—'; pub(crate) fn print_migration_lists(config: Config) -> StdResult<()> { let applied_migration_names = match config.database_connection_string() { Ok(ref database_connection_string) => { let connection = PostgresConnection::open(database_connection_string)?; let mut manager = MigrationManager::new(connection); let applied_migration_names = manager.applied_migration_names()?; show_applied_migrations(&applied_migration_names); applied_migration_names } Err(e) if *e.kind() == ErrorKind::MissedEnvVar(String::new()) => { println!("{}", e.kind()); println!("No connection to database"); Vec::new() } Err(e) => panic!(e), }; println!(); let pending_migrations = filter_pending_migrations(config.migrations()?, &applied_migration_names); show_pending_migrations(&pending_migrations); Ok(()) } fn show_applied_migrations(applied_migration_names: &[String]) { println!("Applied migrations:"); if applied_migration_names.is_empty() { println!("{}", EM_DASH); } else { applied_migration_names .iter() .rev() .for_each(|name| println!("{}", name)); } } fn show_pending_migrations(pending_migrations: &[Migration]) { println!("Pending migrations:"); if pending_migrations.is_empty() { println!("{}", EM_DASH); } else { pending_migrations.iter().for_each(|m| { println!("{}", m.name()); }); } }