database-migration 0.2.0

Database agnostic functions and data structures to build database migration tools.
Documentation
use crate::migration::ProblematicMigration;
use indexmap::IndexMap;

#[derive(thiserror::Error, Debug, Clone, PartialEq, Eq)]
pub enum Error {
    #[error("migrations changed after execution: {0:?}")]
    ChangedAfterExecution(Vec<ProblematicMigration>),
    #[error("failed to load settings: {0}")]
    Configuration(String),
    #[error("failed to create migrations folder: {0}")]
    CreatingMigrationsFolder(String),
    #[error("failed to create script file: {0}")]
    CreatingScriptFile(String),
    #[error("database query failed: {0}")]
    DbQuery(String),
    #[error("db script execution failed: {0:?}")]
    DbScript(IndexMap<usize, String>),
    #[error(transparent)]
    Definition(#[from] DefinitionError),
    #[error("failed to insert the migration execution for key={0} into the migrations table")]
    ExecutionNotInserted(String),
    #[error("failed to delete the migration execution for key={0} from the migrations table")]
    ExecutionNotDeleted(String),
    #[error("failed to query table definitions: {0}")]
    FetchingTableDefinitions(String),
    #[error("migrations out of order: {0:?}")]
    OutOfOrder(Vec<ProblematicMigration>),
    #[error("failed reading migration files: {0}")]
    ReadingMigrationFile(String),
    #[error("failed scanning migration directory: {0}")]
    ScanningMigrationDirectory(String),
}

#[derive(thiserror::Error, Debug, Clone, PartialEq, Eq)]
pub enum DefinitionError {
    #[error("direction is ambiguous")]
    AmbiguousDirection,
    #[error("invalid date: {0}")]
    InvalidDate(String),
    #[error("invalid time: {0}")]
    InvalidTime(String),
    #[error("definition contains an invalid utf-8 character")]
    InvalidUtf8Character,
    #[error("definition does not contain a date")]
    MissingDate,
    #[error("definition does not contain a time")]
    MissingTime,
    #[error("filename of definition is invalid")]
    InvalidFilename,
}

#[derive(thiserror::Error, Debug, Clone, PartialEq, Eq)]
pub enum FilePatternError {
    #[error("invalid characters '{0:?}' in filename pattern")]
    InvalidCharacter(Vec<char>),
    #[error("invalid pattern: {0}")]
    InvalidPattern(String),
    #[error("an empty pattern together with OR ('|') is not allowed")]
    EmptySubPatternNotAllowed,
}

impl From<FilePatternError> for Error {
    fn from(value: FilePatternError) -> Self {
        Self::Configuration(value.to_string())
    }
}