From 0892fe26ba01d7b633312d40a073ee958ea3e4a3 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Mon, 5 Feb 2018 01:20:01 +0200 Subject: [PATCH] Manually implement From Trait for the DatabaseError. --- hammond-data/src/database.rs | 5 +++-- hammond-data/src/dbqueries.rs | 1 + hammond-data/src/errors.rs | 40 ++++++++++++++++++++++++++++------- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/hammond-data/src/database.rs b/hammond-data/src/database.rs index 8cc0a5f..d943957 100644 --- a/hammond-data/src/database.rs +++ b/hammond-data/src/database.rs @@ -7,6 +7,7 @@ use diesel::r2d2::ConnectionManager; use std::io; use std::path::PathBuf; +use errors::DatabaseError; use failure::Error; #[cfg(not(test))] @@ -57,7 +58,7 @@ fn init_pool(db_path: &str) -> Pool { pool } -fn run_migration_on(connection: &SqliteConnection) -> Result<(), Error> { +fn run_migration_on(connection: &SqliteConnection) -> Result<(), DatabaseError> { info!("Running DB Migrations..."); // embedded_migrations::run(connection)?; embedded_migrations::run_with_output(connection, &mut io::stdout()).map_err(From::from) @@ -66,7 +67,7 @@ fn run_migration_on(connection: &SqliteConnection) -> Result<(), Error> { /// Reset the database into a clean state. // Test share a Temp file db. #[allow(dead_code)] -pub fn truncate_db() -> Result<(), Error> { +pub fn truncate_db() -> Result<(), DatabaseError> { let db = connection(); let con = db.get()?; con.execute("DELETE FROM episode")?; diff --git a/hammond-data/src/dbqueries.rs b/hammond-data/src/dbqueries.rs index 5a4417a..7dc68a5 100644 --- a/hammond-data/src/dbqueries.rs +++ b/hammond-data/src/dbqueries.rs @@ -10,6 +10,7 @@ use failure::Error; use database::connection; use models::*; +// use errors::DatabaseError; // Feel free to open a Merge request that manually replaces Result if you feel bored. use std::result; diff --git a/hammond-data/src/errors.rs b/hammond-data/src/errors.rs index d694969..ed5ffd1 100644 --- a/hammond-data/src/errors.rs +++ b/hammond-data/src/errors.rs @@ -22,23 +22,47 @@ struct IOError(io::Error); #[derive(Fail, Debug)] pub enum DatabaseError { #[fail(display = "SQL Query failed: {}", _0)] - DieselResultError(diesel::result::Error), + DieselResultError(#[cause] diesel::result::Error), #[fail(display = "Database Migration error: {}", _0)] - DieselMigrationError(RunMigrationsError), + DieselMigrationError(#[cause] RunMigrationsError), #[fail(display = "R2D2 error: {}", _0)] - R2D2Error(r2d2::Error), + R2D2Error(#[cause] r2d2::Error), #[fail(display = "R2D2 Pool error: {}", _0)] - R2D2PoolError(r2d2::PoolError), + R2D2PoolError(#[cause] r2d2::PoolError), +} + +impl From for DatabaseError { + fn from(err: RunMigrationsError) -> Self { + DatabaseError::DieselMigrationError(err) + } +} + +impl From for DatabaseError { + fn from(err: diesel::result::Error) -> Self { + DatabaseError::DieselResultError(err) + } +} + +impl From for DatabaseError { + fn from(err: r2d2::Error) -> Self { + DatabaseError::R2D2Error(err) + } +} + +impl From for DatabaseError { + fn from(err: r2d2::PoolError) -> Self { + DatabaseError::R2D2PoolError(err) + } } #[derive(Fail, Debug)] pub enum HttpError { #[fail(display = "Reqwest Error: {}", _0)] - ReqError(reqwest::Error), + ReqError(#[cause] reqwest::Error), #[fail(display = "Hyper Error: {}", _0)] - HyperError(hyper::Error), + HyperError(#[cause] hyper::Error), #[fail(display = "Url Error: {}", _0)] - UrlError(url::ParseError), + UrlError(#[cause] url::ParseError), #[fail(display = "TLS Error: {}", _0)] - TLSError(native_tls::Error), + TLSError(#[cause] native_tls::Error), }