#[derive(Debug)]
pub enum MigrationError {
Io(std::io::Error),
Database(tokio_postgres::Error),
}
impl std::fmt::Display for MigrationError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
MigrationError::Io(err) => std::fmt::Display::fmt(err, f),
MigrationError::Database(err) => std::fmt::Display::fmt(err, f),
}
}
}
impl std::error::Error for MigrationError {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
MigrationError::Io(err) => Some(err),
MigrationError::Database(err) => Some(err),
}
}
}
impl From<std::io::Error> for MigrationError {
fn from(kind: std::io::Error) -> Self {
MigrationError::Io(kind)
}
}
impl From<tokio_postgres::Error> for MigrationError {
fn from(kind: tokio_postgres::Error) -> Self {
MigrationError::Database(kind)
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::error::Error;
#[test]
fn test_migration_error_io() {
let io_error = std::io::Error::new(std::io::ErrorKind::NotFound, "io error");
let error = MigrationError::from(io_error);
let source = error.source().unwrap();
let message = "io error";
assert_eq!(format!("{error}"), message);
assert_eq!(format!("{source}"), message);
}
#[test]
fn test_migration_error_database() {
let pg_error = tokio_postgres::Error::__private_api_timeout(); let error = MigrationError::from(pg_error);
let source = error.source().unwrap();
let message = "timeout waiting for server";
assert_eq!(format!("{error}"), message);
assert_eq!(format!("{source}"), message);
}
}