From ede4c21e30af22f07a902427c557a77acbd28b97 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Mon, 5 Feb 2018 01:39:50 +0200 Subject: [PATCH] Merge the Errors into a single Enum. --- hammond-data/src/database.rs | 7 ++- hammond-data/src/dbqueries.rs | 66 +++++++++++++------------- hammond-data/src/errors.rs | 54 ++++++++++----------- hammond-data/src/models/new_episode.rs | 2 +- hammond-data/src/models/new_source.rs | 2 +- hammond-downloader/src/errors.rs | 2 +- 6 files changed, 65 insertions(+), 68 deletions(-) diff --git a/hammond-data/src/database.rs b/hammond-data/src/database.rs index d943957..d6e5be0 100644 --- a/hammond-data/src/database.rs +++ b/hammond-data/src/database.rs @@ -7,8 +7,7 @@ use diesel::r2d2::ConnectionManager; use std::io; use std::path::PathBuf; -use errors::DatabaseError; -use failure::Error; +use errors::DataError; #[cfg(not(test))] use xdg_dirs; @@ -58,7 +57,7 @@ fn init_pool(db_path: &str) -> Pool { pool } -fn run_migration_on(connection: &SqliteConnection) -> Result<(), DatabaseError> { +fn run_migration_on(connection: &SqliteConnection) -> Result<(), DataError> { info!("Running DB Migrations..."); // embedded_migrations::run(connection)?; embedded_migrations::run_with_output(connection, &mut io::stdout()).map_err(From::from) @@ -67,7 +66,7 @@ fn run_migration_on(connection: &SqliteConnection) -> Result<(), DatabaseError> /// Reset the database into a clean state. // Test share a Temp file db. #[allow(dead_code)] -pub fn truncate_db() -> Result<(), DatabaseError> { +pub fn truncate_db() -> Result<(), DataError> { 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 7dc68a5..758488b 100644 --- a/hammond-data/src/dbqueries.rs +++ b/hammond-data/src/dbqueries.rs @@ -6,17 +6,16 @@ use diesel::prelude::*; use diesel; use diesel::dsl::exists; use diesel::select; -use failure::Error; use database::connection; +use errors::DataError; use models::*; -// use errors::DatabaseError; // Feel free to open a Merge request that manually replaces Result if you feel bored. use std::result; -type Result = result::Result; +type DatabaseResult = result::Result; -pub fn get_sources() -> Result> { +pub fn get_sources() -> DatabaseResult> { use schema::source::dsl::*; let db = connection(); let con = db.get()?; @@ -27,7 +26,7 @@ pub fn get_sources() -> Result> { .map_err(From::from) } -pub fn get_podcasts() -> Result> { +pub fn get_podcasts() -> DatabaseResult> { use schema::podcast::dsl::*; let db = connection(); let con = db.get()?; @@ -38,7 +37,7 @@ pub fn get_podcasts() -> Result> { .map_err(From::from) } -pub fn get_episodes() -> Result> { +pub fn get_episodes() -> DatabaseResult> { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; @@ -49,7 +48,7 @@ pub fn get_episodes() -> Result> { .map_err(From::from) } -pub(crate) fn get_downloaded_episodes() -> Result> { +pub(crate) fn get_downloaded_episodes() -> DatabaseResult> { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; @@ -61,7 +60,7 @@ pub(crate) fn get_downloaded_episodes() -> Result> { .map_err(From::from) } -// pub(crate) fn get_played_episodes() -> Result> { +// pub(crate) fn get_played_episodes() -> DatabaseResult> { // use schema::episode::dsl::*; // let db = connection(); @@ -72,7 +71,7 @@ pub(crate) fn get_downloaded_episodes() -> Result> { // .map_err(From::from) // } -pub(crate) fn get_played_cleaner_episodes() -> Result> { +pub(crate) fn get_played_cleaner_episodes() -> DatabaseResult> { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; @@ -84,7 +83,7 @@ pub(crate) fn get_played_cleaner_episodes() -> Result> .map_err(From::from) } -pub fn get_episode_from_rowid(ep_id: i32) -> Result { +pub fn get_episode_from_rowid(ep_id: i32) -> DatabaseResult { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; @@ -95,7 +94,7 @@ pub fn get_episode_from_rowid(ep_id: i32) -> Result { .map_err(From::from) } -pub fn get_episode_local_uri_from_id(ep_id: i32) -> Result> { +pub fn get_episode_local_uri_from_id(ep_id: i32) -> DatabaseResult> { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; @@ -107,7 +106,7 @@ pub fn get_episode_local_uri_from_id(ep_id: i32) -> Result> { .map_err(From::from) } -pub fn get_episodes_widgets_with_limit(limit: u32) -> Result> { +pub fn get_episodes_widgets_with_limit(limit: u32) -> DatabaseResult> { use schema::episode; let db = connection(); let con = db.get()?; @@ -130,7 +129,7 @@ pub fn get_episodes_widgets_with_limit(limit: u32) -> Result Result { +pub fn get_podcast_from_id(pid: i32) -> DatabaseResult { use schema::podcast::dsl::*; let db = connection(); let con = db.get()?; @@ -141,7 +140,7 @@ pub fn get_podcast_from_id(pid: i32) -> Result { .map_err(From::from) } -pub fn get_podcast_cover_from_id(pid: i32) -> Result { +pub fn get_podcast_cover_from_id(pid: i32) -> DatabaseResult { use schema::podcast::dsl::*; let db = connection(); let con = db.get()?; @@ -153,7 +152,7 @@ pub fn get_podcast_cover_from_id(pid: i32) -> Result { .map_err(From::from) } -pub fn get_pd_episodes(parent: &Podcast) -> Result> { +pub fn get_pd_episodes(parent: &Podcast) -> DatabaseResult> { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; @@ -164,7 +163,7 @@ pub fn get_pd_episodes(parent: &Podcast) -> Result> { .map_err(From::from) } -pub fn get_pd_episodeswidgets(parent: &Podcast) -> Result> { +pub fn get_pd_episodeswidgets(parent: &Podcast) -> DatabaseResult> { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; @@ -177,7 +176,7 @@ pub fn get_pd_episodeswidgets(parent: &Podcast) -> Result Result> { +pub fn get_pd_unplayed_episodes(parent: &Podcast) -> DatabaseResult> { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; @@ -189,8 +188,8 @@ pub fn get_pd_unplayed_episodes(parent: &Podcast) -> Result> { .map_err(From::from) } -// pub(crate) fn get_pd_episodes_limit(parent: &Podcast, limit: u32) -> Result> { -// use schema::episode::dsl::*; +// pub(crate) fn get_pd_episodes_limit(parent: &Podcast, limit: u32) -> +// DatabaseResult> { use schema::episode::dsl::*; // let db = connection(); // let con = db.get()?; @@ -202,7 +201,7 @@ pub fn get_pd_unplayed_episodes(parent: &Podcast) -> Result> { // .map_err(From::from) // } -pub fn get_source_from_uri(uri_: &str) -> Result { +pub fn get_source_from_uri(uri_: &str) -> DatabaseResult { use schema::source::dsl::*; let db = connection(); let con = db.get()?; @@ -213,7 +212,7 @@ pub fn get_source_from_uri(uri_: &str) -> Result { .map_err(From::from) } -pub fn get_source_from_id(id_: i32) -> Result { +pub fn get_source_from_id(id_: i32) -> DatabaseResult { use schema::source::dsl::*; let db = connection(); let con = db.get()?; @@ -224,7 +223,7 @@ pub fn get_source_from_id(id_: i32) -> Result { .map_err(From::from) } -pub fn get_podcast_from_source_id(sid: i32) -> Result { +pub fn get_podcast_from_source_id(sid: i32) -> DatabaseResult { use schema::podcast::dsl::*; let db = connection(); let con = db.get()?; @@ -235,7 +234,7 @@ pub fn get_podcast_from_source_id(sid: i32) -> Result { .map_err(From::from) } -pub fn get_episode_from_pk(title_: &str, pid: i32) -> Result { +pub fn get_episode_from_pk(title_: &str, pid: i32) -> DatabaseResult { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; @@ -247,7 +246,10 @@ pub fn get_episode_from_pk(title_: &str, pid: i32) -> Result { .map_err(From::from) } -pub(crate) fn get_episode_minimal_from_pk(title_: &str, pid: i32) -> Result { +pub(crate) fn get_episode_minimal_from_pk( + title_: &str, + pid: i32, +) -> DatabaseResult { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; @@ -260,11 +262,11 @@ pub(crate) fn get_episode_minimal_from_pk(title_: &str, pid: i32) -> Result Result<()> { +pub(crate) fn remove_feed(pd: &Podcast) -> DatabaseResult<()> { let db = connection(); let con = db.get()?; - con.transaction(|| -> Result<()> { + con.transaction(|| { delete_source(&con, pd.source_id())?; delete_podcast(&con, pd.id())?; delete_podcast_episodes(&con, pd.id())?; @@ -291,7 +293,7 @@ fn delete_podcast_episodes(con: &SqliteConnection, parent_id: i32) -> QueryResul diesel::delete(episode.filter(podcast_id.eq(parent_id))).execute(con) } -pub fn source_exists(url: &str) -> Result { +pub fn source_exists(url: &str) -> DatabaseResult { use schema::source::dsl::*; let db = connection(); @@ -302,7 +304,7 @@ pub fn source_exists(url: &str) -> Result { .map_err(From::from) } -pub(crate) fn podcast_exists(source_id_: i32) -> Result { +pub(crate) fn podcast_exists(source_id_: i32) -> DatabaseResult { use schema::podcast::dsl::*; let db = connection(); @@ -314,7 +316,7 @@ pub(crate) fn podcast_exists(source_id_: i32) -> Result { } #[cfg_attr(rustfmt, rustfmt_skip)] -pub(crate) fn episode_exists(title_: &str, podcast_id_: i32) -> Result { +pub(crate) fn episode_exists(title_: &str, podcast_id_: i32) -> DatabaseResult { use schema::episode::dsl::*; let db = connection(); @@ -325,7 +327,7 @@ pub(crate) fn episode_exists(title_: &str, podcast_id_: i32) -> Result { .map_err(From::from) } -pub(crate) fn index_new_episodes(eps: &[NewEpisode]) -> Result<()> { +pub(crate) fn index_new_episodes(eps: &[NewEpisode]) -> DatabaseResult<()> { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; @@ -337,13 +339,13 @@ pub(crate) fn index_new_episodes(eps: &[NewEpisode]) -> Result<()> { .map(|_| ()) } -pub fn update_none_to_played_now(parent: &Podcast) -> Result { +pub fn update_none_to_played_now(parent: &Podcast) -> DatabaseResult { use schema::episode::dsl::*; let db = connection(); let con = db.get()?; let epoch_now = Utc::now().timestamp() as i32; - con.transaction(|| -> Result { + con.transaction(|| { diesel::update(Episode::belonging_to(parent).filter(played.is_null())) .set(played.eq(Some(epoch_now))) .execute(&con) diff --git a/hammond-data/src/errors.rs b/hammond-data/src/errors.rs index ed5ffd1..34f409b 100644 --- a/hammond-data/src/errors.rs +++ b/hammond-data/src/errors.rs @@ -20,7 +20,7 @@ struct IOError(io::Error); // struct RSSError(rss::Error); #[derive(Fail, Debug)] -pub enum DatabaseError { +pub enum DataError { #[fail(display = "SQL Query failed: {}", _0)] DieselResultError(#[cause] diesel::result::Error), #[fail(display = "Database Migration error: {}", _0)] @@ -29,34 +29,6 @@ pub enum DatabaseError { R2D2Error(#[cause] r2d2::Error), #[fail(display = "R2D2 Pool error: {}", _0)] 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(#[cause] reqwest::Error), #[fail(display = "Hyper Error: {}", _0)] @@ -66,3 +38,27 @@ pub enum HttpError { #[fail(display = "TLS Error: {}", _0)] TLSError(#[cause] native_tls::Error), } + +impl From for DataError { + fn from(err: RunMigrationsError) -> Self { + DataError::DieselMigrationError(err) + } +} + +impl From for DataError { + fn from(err: diesel::result::Error) -> Self { + DataError::DieselResultError(err) + } +} + +impl From for DataError { + fn from(err: r2d2::Error) -> Self { + DataError::R2D2Error(err) + } +} + +impl From for DataError { + fn from(err: r2d2::PoolError) -> Self { + DataError::R2D2PoolError(err) + } +} diff --git a/hammond-data/src/models/new_episode.rs b/hammond-data/src/models/new_episode.rs index 6e487a7..668787f 100644 --- a/hammond-data/src/models/new_episode.rs +++ b/hammond-data/src/models/new_episode.rs @@ -120,7 +120,7 @@ impl NewEpisode { #[allow(dead_code)] pub(crate) fn to_episode(&self) -> Result { self.index()?; - dbqueries::get_episode_from_pk(&self.title, self.podcast_id) + dbqueries::get_episode_from_pk(&self.title, self.podcast_id).map_err(From::from) } } diff --git a/hammond-data/src/models/new_source.rs b/hammond-data/src/models/new_source.rs index fbe79f1..0fb0400 100644 --- a/hammond-data/src/models/new_source.rs +++ b/hammond-data/src/models/new_source.rs @@ -47,6 +47,6 @@ impl NewSource { // Look out for when tryinto lands into stable. pub(crate) fn to_source(&self) -> Result { self.insert_or_ignore()?; - dbqueries::get_source_from_uri(&self.uri) + dbqueries::get_source_from_uri(&self.uri).map_err(From::from) } } diff --git a/hammond-downloader/src/errors.rs b/hammond-downloader/src/errors.rs index 7bab62d..8ee10d3 100644 --- a/hammond-downloader/src/errors.rs +++ b/hammond-downloader/src/errors.rs @@ -7,7 +7,7 @@ pub enum DownloaderError { #[fail(display = "Reqwest error: {}", _0)] RequestError(reqwest::Error), #[fail(display = "Data error: {}", _0)] - DataError(hammond_data::errors::DatabaseError), + DataError(hammond_data::errors::DataError), #[fail(display = "Io error: {}", _0)] IoError(io::Error), }