use crate::database::Database; use crate::error::Result; use crate::migration::migration_2::PosAndNetherMigration; use geoffrey_models::models::db_metadata::DBMetadata; mod migration_2; trait Migration { fn up(db: &Database) -> Result<()>; fn down(db: &Database) -> Result<()>; fn version() -> u64; } fn upgrade(db: &Database, current_version: u64, target_version: u64) -> Result<()> { for ver in current_version+1..=target_version { match ver { 2 => PosAndNetherMigration::up(db)?, _ => () } } Ok(()) } fn downgrade(db: &Database, current_version: u64, target_version: u64) -> Result<()> { for ver in (target_version..current_version).rev() { match ver { 2 => PosAndNetherMigration::up(db)?, _ => () } } Ok(()) } pub fn do_migration(db: &Database, target_version: u64) -> Result<()> { let current_version = db.version().unwrap_or(0); if target_version > current_version { upgrade(db, current_version, target_version)?; } else if target_version < current_version { downgrade(db, current_version, target_version)?; } let metadata = DBMetadata { version: target_version, }; db.insert(metadata)?; Ok(()) }