33 lines
672 B
Rust
33 lines
672 B
Rust
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<T: 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(())
|
|
}
|