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 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<RunMigrationsError> for DataError {
@ -85,3 +93,9 @@ impl From<io::Error> for DataError {
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;
#[macro_use]
extern crate diesel_migrations;
// #[macro_use]
#[macro_use]
extern crate failure;
#[macro_use]
extern crate failure_derive;

View File

@ -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 {

View File

@ -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)