diff --git a/hammond-data/src/errors.rs b/hammond-data/src/errors.rs index b230cc8..6a2d00c 100644 --- a/hammond-data/src/errors.rs +++ b/hammond-data/src/errors.rs @@ -5,6 +5,7 @@ use hyper; use native_tls; use reqwest; use rss; +use url; use std::io; @@ -17,6 +18,7 @@ error_chain! { RSSError(rss::Error); ReqError(reqwest::Error); HyperError(hyper::Error); + UrlError(url::ParseError); TLSError(native_tls::Error); IoError(io::Error); } diff --git a/hammond-data/src/models/new_source.rs b/hammond-data/src/models/new_source.rs index 9490ac3..46544f8 100644 --- a/hammond-data/src/models/new_source.rs +++ b/hammond-data/src/models/new_source.rs @@ -2,11 +2,11 @@ use diesel; use diesel::prelude::*; +use url::Url; use database::connection; use dbqueries; // use models::{Insert, Update}; -use models::Insert; use models::Source; use schema::source; @@ -24,30 +24,30 @@ pub(crate) struct NewSource { http_etag: Option, } -impl Insert for NewSource { - fn insert(&self) -> Result<()> { - use schema::source::dsl::*; - let db = connection(); - let con = db.get()?; - - // FIXME: Insert or ignore - let _ = diesel::insert_into(source).values(self).execute(&con); - Ok(()) - } -} - impl NewSource { - pub(crate) fn new(uri: &str) -> NewSource { + pub(crate) fn new(uri: &Url) -> NewSource { NewSource { - uri: uri.trim().to_string(), + uri: uri.to_string(), last_modified: None, http_etag: None, } } + pub(crate) fn insert_or_ignore(&self) -> Result<()> { + use schema::source::dsl::*; + let db = connection(); + let con = db.get()?; + + diesel::insert_or_ignore_into(source) + .values(self) + .execute(&con) + .map(|_| ()) + .map_err(From::from) + } + // Look out for when tryinto lands into stable. pub(crate) fn into_source(self) -> Result { - self.insert()?; + self.insert_or_ignore()?; dbqueries::get_source_from_uri(&self.uri) } } diff --git a/hammond-data/src/models/source.rs b/hammond-data/src/models/source.rs index 36ac7b7..927e9d3 100644 --- a/hammond-data/src/models/source.rs +++ b/hammond-data/src/models/source.rs @@ -1,5 +1,6 @@ use diesel::SaveChangesDsl; use rss::Channel; +use url::Url; use hyper; use hyper::{Client, Method, Request, Response, StatusCode, Uri}; @@ -146,7 +147,9 @@ impl Source { /// /// This only indexes the `Source` struct, not the Podcast Feed. pub fn from_url(uri: &str) -> Result { - NewSource::new(uri).into_source() + let url = Url::parse(&uri)?; + + NewSource::new(&url).into_source() } /// `Feed` constructor. diff --git a/hammond-data/src/utils.rs b/hammond-data/src/utils.rs index 4ecb386..2e152f9 100644 --- a/hammond-data/src/utils.rs +++ b/hammond-data/src/utils.rs @@ -136,7 +136,7 @@ pub fn get_download_folder(pd_title: &str) -> Result { /// Removes all the entries associated with the given show from the database, /// and deletes all of the downloaded content. -/// TODO: Write Tests +// TODO: Write Tests pub fn delete_show(pd: &Podcast) -> Result<()> { dbqueries::remove_feed(pd)?; info!("{} was removed succesfully.", pd.title());