#[derive(Debug, PartialEq)]
pub enum MigrateStep {
Up,
Down,
Basic,
}
impl MigrateStep {
pub fn from_filename(filename: &str) -> Self {
if filename.ends_with(MigrateStep::Up.extension()) {
Self::Up
} else if filename.ends_with(MigrateStep::Down.extension()) {
Self::Down
} else {
Self::Basic
}
}
pub fn extension(&self) -> &str {
match self {
Self::Up => ".up.sql",
Self::Down => ".down.sql",
Self::Basic => ".sql",
}
}
pub fn is_down_migration(&self) -> bool {
matches!(self, Self::Down)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_migrate_step_up() {
let filename = "0001_create_users.up.sql";
let step = MigrateStep::from_filename(filename);
assert_eq!(step, MigrateStep::Up);
assert_eq!(step.extension(), ".up.sql");
assert!(!step.is_down_migration());
}
#[test]
fn test_migrate_step_down() {
let filename = "0002_create_users.down.sql";
let step = MigrateStep::from_filename(filename);
assert_eq!(step, MigrateStep::Down);
assert_eq!(step.extension(), ".down.sql");
assert!(step.is_down_migration());
}
#[test]
fn test_migrate_step_basic() {
let filename = "0003_create_users.sql";
let step = MigrateStep::from_filename(filename);
assert_eq!(step, MigrateStep::Basic);
assert_eq!(step.extension(), ".sql");
assert!(!step.is_down_migration());
}
}