database-migration 0.2.0

Database agnostic functions and data structures to build database migration tools.
Documentation
use crate::checksum::Checksum;
use chrono::{DateTime, NaiveDateTime, Utc};
use serde::{Deserialize, Serialize};
use std::fmt::{Display, Formatter};
use std::path::PathBuf;
use std::time::Duration;

#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
pub enum MigrationKind {
    Baseline,
    Up,
    Down,
}

impl MigrationKind {
    pub const fn as_str(&self) -> &'static str {
        match self {
            Self::Baseline => "baseline",
            Self::Up => "up",
            Self::Down => "down",
        }
    }

    pub fn is_backward(&self) -> bool {
        *self == Self::Down
    }

    pub fn is_forward(&self) -> bool {
        !self.is_backward()
    }

    pub const fn is_any(&self) -> bool {
        true
    }
}

impl Display for MigrationKind {
    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
        write!(f, "{}", self.as_str())
    }
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct NewMigration {
    pub key: NaiveDateTime,
    pub title: String,
    pub kind: MigrationKind,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Migration {
    pub key: NaiveDateTime,
    pub title: String,
    pub kind: MigrationKind,
    pub script_path: PathBuf,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ScriptContent {
    pub key: NaiveDateTime,
    pub kind: MigrationKind,
    pub path: PathBuf,
    pub content: String,
    pub checksum: Checksum,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ApplicableMigration {
    pub key: NaiveDateTime,
    pub kind: MigrationKind,
    pub script_content: String,
    pub checksum: Checksum,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Execution {
    pub key: NaiveDateTime,
    pub applied_rank: i64,
    pub applied_by: String,
    pub applied_at: DateTime<Utc>,
    pub checksum: Checksum,
    pub execution_time: Duration,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Reversion {
    pub key: NaiveDateTime,
    pub reverted_by: String,
    pub reverted_at: DateTime<Utc>,
    pub execution_time: Duration,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProblematicMigration {
    pub key: NaiveDateTime,
    pub kind: MigrationKind,
    pub script_path: PathBuf,
    pub problem: Problem,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Problem {
    ChecksumMismatch {
        definition_checksum: Checksum,
        execution_checksum: Checksum,
    },
    OutOfOrder {
        last_applied_key: NaiveDateTime,
    },
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum MigrationsTableInfo {
    NoTables,
    Missing,
    Table {
        name: String,
        version: Option<String>,
        definition: String,
    },
}

#[cfg(test)]
mod tests;