use crate::database::Database; use crate::error::Result; use crate::metadata::DBMetadata; pub trait Migration { fn up(&self, db: &Database) -> Result<()>; fn down(&self, db: &Database) -> Result<()>; fn version(&self) -> u64; } #[derive(Debug, Clone, Eq, PartialEq)] pub enum Direction { Up, Down, } pub fn do_migration(db: &Database, migration: T, direction: Direction) -> Result<()> { if direction == Direction::Up { migration.up(db)?; } else { migration.down(db)?; } let metadata = DBMetadata { id: None, version: migration.version(), }; db.insert(metadata)?; Ok(()) }