diff --git a/hammond-data/src/errors.rs b/hammond-data/src/errors.rs index 3c73e1a..57a65cd 100644 --- a/hammond-data/src/errors.rs +++ b/hammond-data/src/errors.rs @@ -7,6 +7,7 @@ use native_tls; use url; use std::io; +// use std::fmt; // fadsadfs NOT SYNC // #[derive(Fail, Debug)] @@ -26,6 +27,7 @@ pub enum DataError { #[fail(display = "Hyper Error: {}", _0)] HyperError(#[cause] hyper::Error), #[fail(display = "Failed to parse a url: {}", _0)] + // TODO: print the url too UrlError(#[cause] url::ParseError), #[fail(display = "TLS Error: {}", _0)] TLSError(#[cause] native_tls::Error), @@ -34,8 +36,14 @@ pub enum DataError { #[fail(display = "RSS Error: {}", _0)] // Rss::Error is not yet Sync RssCrateError(String), - #[fail(display = "WANNABE BAIL ERROR: {}", _0)] + #[fail(display = "Error: {}", _0)] DiscountBail(String), + #[fail(display = "Request to {} returned {}. Contex: {}", url, status_code, contex)] + HttpStatusError { + url: String, + status_code: hyper::StatusCode, + contex: String, + }, } impl From for DataError { @@ -85,3 +93,9 @@ impl From for DataError { DataError::IOError(err) } } + +impl From for DataError { + fn from(err: String) -> Self { + DataError::DiscountBail(err) + } +} diff --git a/hammond-data/src/lib.rs b/hammond-data/src/lib.rs index 3fbbadc..5fbcd49 100644 --- a/hammond-data/src/lib.rs +++ b/hammond-data/src/lib.rs @@ -27,7 +27,7 @@ extern crate derive_builder; extern crate diesel; #[macro_use] extern crate diesel_migrations; -// #[macro_use] +#[macro_use] extern crate failure; #[macro_use] extern crate failure_derive; diff --git a/hammond-data/src/models/new_episode.rs b/hammond-data/src/models/new_episode.rs index 6b2b63e..e943688 100644 --- a/hammond-data/src/models/new_episode.rs +++ b/hammond-data/src/models/new_episode.rs @@ -210,7 +210,7 @@ impl NewEpisodeMinimal { let duration = parser::parse_itunes_duration(item.itunes_ext()); - Ok(NewEpisodeMinimalBuilder::default() + NewEpisodeMinimalBuilder::default() .title(title) .uri(uri) .duration(duration) @@ -218,7 +218,7 @@ impl NewEpisodeMinimal { .guid(guid) .podcast_id(parent_id) .build() - .unwrap()) + .map_err(From::from) } pub(crate) fn into_new_episode(self, item: &rss::Item) -> NewEpisode { diff --git a/hammond-data/src/models/source.rs b/hammond-data/src/models/source.rs index c009041..f283c6b 100644 --- a/hammond-data/src/models/source.rs +++ b/hammond-data/src/models/source.rs @@ -1,4 +1,5 @@ use diesel::SaveChangesDsl; +// use failure::ResultExt; use rss::Channel; use url::Url; @@ -115,29 +116,64 @@ impl Source { let code = res.status(); match code { StatusCode::NotModified => { - return Err(DataError::DiscountBail(format!("304: skipping.."))) + let err = DataError::HttpStatusError { + url: self.uri, + status_code: code, + contex: format!("304: skipping.."), + }; + + return Err(err); } StatusCode::MovedPermanently => { error!("Feed was moved permanently."); self.handle_301(&res)?; - return Err(DataError::DiscountBail(format!( - "301: Feed was moved permanently." - ))); + + let err = DataError::HttpStatusError { + url: self.uri, + status_code: code, + contex: format!("301: Feed was moved permanently."), + }; + + return Err(err); } StatusCode::TemporaryRedirect => debug!("307: Temporary Redirect."), StatusCode::PermanentRedirect => warn!("308: Permanent Redirect."), StatusCode::Unauthorized => { - return Err(DataError::DiscountBail(format!("401: Unauthorized."))) + let err = DataError::HttpStatusError { + url: self.uri, + status_code: code, + contex: format!("401: Unauthorized."), + }; + + return Err(err); } StatusCode::Forbidden => { - return Err(DataError::DiscountBail(format!("403: Forbidden."))) + let err = DataError::HttpStatusError { + url: self.uri, + status_code: code, + contex: format!("403: Forbidden."), + }; + + return Err(err); } - StatusCode::NotFound => return Err(DataError::DiscountBail(format!("404: Not found."))), + StatusCode::NotFound => return Err(format!("404: Not found.")).map_err(From::from), StatusCode::RequestTimeout => { - return Err(DataError::DiscountBail(format!("408: Request Timeout."))) + let err = DataError::HttpStatusError { + url: self.uri, + status_code: code, + contex: format!("408: Request Timeout."), + }; + + return Err(err); } StatusCode::Gone => { - return Err(DataError::DiscountBail(format!("410: Feed was deleted."))) + let err = DataError::HttpStatusError { + url: self.uri, + status_code: code, + contex: format!("410: Feed was deleted.."), + }; + + return Err(err); } _ => info!("HTTP StatusCode: {}", code), }; @@ -187,11 +223,11 @@ impl Source { let feed = self.request_constructor(client, ignore_etags) .and_then(move |(_, res)| response_to_channel(res, pool)) .and_then(move |chan| { - Ok(FeedBuilder::default() + FeedBuilder::default() .channel(chan) .source_id(id) .build() - .unwrap()) + .map_err(From::from) }); Box::new(feed)