1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
use result;

use std::convert::From;
use std::{fmt, io};
use std::path::PathBuf;
use std::error::Error;

#[derive(Debug)]
pub enum MigrationError {
    MigrationDirectoryNotFound,
    UnknownMigrationFormat(PathBuf),
    IoError(io::Error),
    UnknownMigrationVersion(String),
    NoMigrationRun,
}

impl Error for MigrationError {
    fn description(&self) -> &str {
        match *self {
            MigrationError::MigrationDirectoryNotFound =>
                "Unable to find migrations directory in this directory or any parent directories.",
            MigrationError::UnknownMigrationFormat(_) =>
                "Invalid migration directory, the directory's name should be \
                <timestamp>_<name_of_migration>, and it should only contain up.sql and down.sql.",
            MigrationError::IoError(ref error) =>
                error.description(),
            MigrationError::UnknownMigrationVersion(_) =>
                "Unable to find migration version to revert in the migrations directory.",
            MigrationError::NoMigrationRun =>
                "No migrations have been run. Did you forget `diesel migration run`?",
        }
    }
}

impl fmt::Display for MigrationError {
    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
        self.description().fmt(f)
    }
}

impl PartialEq for MigrationError {
    fn eq(&self, other: &Self) -> bool {
        match (self, other) {
            (
                &MigrationError::MigrationDirectoryNotFound,
                &MigrationError::MigrationDirectoryNotFound,
            ) => true,
            (
                &MigrationError::UnknownMigrationFormat(ref p1),
                &MigrationError::UnknownMigrationFormat(ref p2),
            ) => p1 == p2,
            _ => false
        }
    }
}

impl From<io::Error> for MigrationError {
    fn from(e: io::Error) -> Self {
        MigrationError::IoError(e)
    }
}

#[derive(Debug, PartialEq)]
#[cfg_attr(feature = "clippy", allow(enum_variant_names))]
pub enum RunMigrationsError {
    MigrationError(MigrationError),
    QueryError(result::Error),
}

impl Error for RunMigrationsError {
    fn description(&self) -> &str {
        match *self {
            RunMigrationsError::MigrationError(ref error) => error.description(),
            RunMigrationsError::QueryError(ref error) => error.description(),
        }
    }
}

impl fmt::Display for RunMigrationsError {
    fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
        self.description().fmt(f)
    }
}

impl From<MigrationError> for RunMigrationsError {
    fn from(e: MigrationError) -> Self {
        RunMigrationsError::MigrationError(e)
    }
}

impl From<result::Error> for RunMigrationsError {
    fn from(e: result::Error) -> Self {
        RunMigrationsError::QueryError(e)
    }
}

impl From<io::Error> for RunMigrationsError {
    fn from(e: io::Error) -> Self {
        RunMigrationsError::MigrationError(e.into())
    }
}