Start creating custom errors instead of using bail! macro.

This commit is contained in:
Jordan Petridis 2018-02-05 18:25:56 +02:00
parent 34d7391363
commit 064c2b4be0
No known key found for this signature in database
GPG Key ID: CEABAD9F5683B9A6
4 changed files with 65 additions and 15 deletions

View File

@ -7,6 +7,7 @@ use native_tls;
use url; use url;
use std::io; use std::io;
// use std::fmt;
// fadsadfs NOT SYNC // fadsadfs NOT SYNC
// #[derive(Fail, Debug)] // #[derive(Fail, Debug)]
@ -26,6 +27,7 @@ pub enum DataError {
#[fail(display = "Hyper Error: {}", _0)] #[fail(display = "Hyper Error: {}", _0)]
HyperError(#[cause] hyper::Error), HyperError(#[cause] hyper::Error),
#[fail(display = "Failed to parse a url: {}", _0)] #[fail(display = "Failed to parse a url: {}", _0)]
// TODO: print the url too
UrlError(#[cause] url::ParseError), UrlError(#[cause] url::ParseError),
#[fail(display = "TLS Error: {}", _0)] #[fail(display = "TLS Error: {}", _0)]
TLSError(#[cause] native_tls::Error), TLSError(#[cause] native_tls::Error),
@ -34,8 +36,14 @@ pub enum DataError {
#[fail(display = "RSS Error: {}", _0)] #[fail(display = "RSS Error: {}", _0)]
// Rss::Error is not yet Sync // Rss::Error is not yet Sync
RssCrateError(String), RssCrateError(String),
#[fail(display = "WANNABE BAIL ERROR: {}", _0)] #[fail(display = "Error: {}", _0)]
DiscountBail(String), DiscountBail(String),
#[fail(display = "Request to {} returned {}. Contex: {}", url, status_code, contex)]
HttpStatusError {
url: String,
status_code: hyper::StatusCode,
contex: String,
},
} }
impl From<RunMigrationsError> for DataError { impl From<RunMigrationsError> for DataError {
@ -85,3 +93,9 @@ impl From<io::Error> for DataError {
DataError::IOError(err) DataError::IOError(err)
} }
} }
impl From<String> for DataError {
fn from(err: String) -> Self {
DataError::DiscountBail(err)
}
}

View File

@ -27,7 +27,7 @@ extern crate derive_builder;
extern crate diesel; extern crate diesel;
#[macro_use] #[macro_use]
extern crate diesel_migrations; extern crate diesel_migrations;
// #[macro_use] #[macro_use]
extern crate failure; extern crate failure;
#[macro_use] #[macro_use]
extern crate failure_derive; extern crate failure_derive;

View File

@ -210,7 +210,7 @@ impl NewEpisodeMinimal {
let duration = parser::parse_itunes_duration(item.itunes_ext()); let duration = parser::parse_itunes_duration(item.itunes_ext());
Ok(NewEpisodeMinimalBuilder::default() NewEpisodeMinimalBuilder::default()
.title(title) .title(title)
.uri(uri) .uri(uri)
.duration(duration) .duration(duration)
@ -218,7 +218,7 @@ impl NewEpisodeMinimal {
.guid(guid) .guid(guid)
.podcast_id(parent_id) .podcast_id(parent_id)
.build() .build()
.unwrap()) .map_err(From::from)
} }
pub(crate) fn into_new_episode(self, item: &rss::Item) -> NewEpisode { pub(crate) fn into_new_episode(self, item: &rss::Item) -> NewEpisode {

View File

@ -1,4 +1,5 @@
use diesel::SaveChangesDsl; use diesel::SaveChangesDsl;
// use failure::ResultExt;
use rss::Channel; use rss::Channel;
use url::Url; use url::Url;
@ -115,29 +116,64 @@ impl Source {
let code = res.status(); let code = res.status();
match code { match code {
StatusCode::NotModified => { 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 => { StatusCode::MovedPermanently => {
error!("Feed was moved permanently."); error!("Feed was moved permanently.");
self.handle_301(&res)?; 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::TemporaryRedirect => debug!("307: Temporary Redirect."),
StatusCode::PermanentRedirect => warn!("308: Permanent Redirect."), StatusCode::PermanentRedirect => warn!("308: Permanent Redirect."),
StatusCode::Unauthorized => { 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 => { 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 => { 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 => { 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), _ => info!("HTTP StatusCode: {}", code),
}; };
@ -187,11 +223,11 @@ impl Source {
let feed = self.request_constructor(client, ignore_etags) let feed = self.request_constructor(client, ignore_etags)
.and_then(move |(_, res)| response_to_channel(res, pool)) .and_then(move |(_, res)| response_to_channel(res, pool))
.and_then(move |chan| { .and_then(move |chan| {
Ok(FeedBuilder::default() FeedBuilder::default()
.channel(chan) .channel(chan)
.source_id(id) .source_id(id)
.build() .build()
.unwrap()) .map_err(From::from)
}); });
Box::new(feed) Box::new(feed)