From ef52a026bcefd24b5fae6dbe9dae3d6f0488a96d Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Sat, 20 Jan 2018 08:46:05 +0200 Subject: [PATCH] Feed: Add Builder pattern. --- hammond-data/benches/bench.rs | 19 ++++++++++++++++--- hammond-data/src/feed.rs | 20 ++++++++++++-------- hammond-data/src/lib.rs | 2 +- hammond-data/src/models/source.rs | 10 ++++++++-- 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/hammond-data/benches/bench.rs b/hammond-data/benches/bench.rs index 7f67862..25421ee 100644 --- a/hammond-data/benches/bench.rs +++ b/hammond-data/benches/bench.rs @@ -51,7 +51,12 @@ fn index_urls() -> Vec>> { let s = Source::from_url(url).unwrap(); // parse it into a channel let chan = rss::Channel::read_from(BufReader::new(buff)).unwrap(); - Feed::from_channel_source(chan, s.id()) + + FeedBuilder::default() + .channel(chan) + .source_id(s.id()) + .build() + .unwrap() }) .collect(); @@ -115,7 +120,11 @@ fn bench_index_large_feed(c: &mut Criterion) { let s = Source::from_url(url).unwrap(); // parse it into a channel let chan = rss::Channel::read_from(BufReader::new(CODE)).unwrap(); - let feed = Feed::from_channel_source(chan, s.id()); + let feed = FeedBuilder::default() + .channel(chan) + .source_id(s.id()) + .build() + .unwrap(); let _foo = core.run(feed.index()).unwrap(); }) }); @@ -132,7 +141,11 @@ fn bench_index_small_feed(c: &mut Criterion) { let s = Source::from_url(url).unwrap(); // parse it into a channel let chan = rss::Channel::read_from(BufReader::new(STARS)).unwrap(); - let feed = Feed::from_channel_source(chan, s.id()); + let feed = FeedBuilder::default() + .channel(chan) + .source_id(s.id()) + .build() + .unwrap(); let _foo = core.run(feed.index()).unwrap(); }) }); diff --git a/hammond-data/src/feed.rs b/hammond-data/src/feed.rs index 1aae17b..6bd125b 100644 --- a/hammond-data/src/feed.rs +++ b/hammond-data/src/feed.rs @@ -12,20 +12,19 @@ use pipeline::*; type InsertUpdate = (Vec, Vec>); -#[derive(Debug)] /// Wrapper struct that hold a `Source` id and the `rss::Channel` /// that corresponds to the `Source.uri` field. +#[derive(Debug, Clone, Builder)] +#[builder(derive(Debug))] +#[builder(setter(into))] pub struct Feed { + /// The `rss::Channel` parsed from the `Source` uri. channel: rss::Channel, + /// The `Source` id where the xml `rss::Channel` came from. source_id: i32, } impl Feed { - /// Constructor that consumes a `rss::Channel`, returns a `Feed` struct. - pub fn from_channel_source(channel: rss::Channel, source_id: i32) -> Feed { - Feed { channel, source_id } - } - /// Index the contents of the RSS `Feed` into the database. pub fn index(self) -> Box> { let fut = self.parse_podcast_async() @@ -102,10 +101,11 @@ mod tests { use tokio_core::reactor::Core; use Source; - use database::truncate_db; use dbqueries; use pipeline; + use database::truncate_db; + use std::fs; use std::io::BufReader; @@ -167,7 +167,11 @@ mod tests { let feed = fs::File::open(path).unwrap(); // parse it into a channel let chan = rss::Channel::read_from(BufReader::new(feed)).unwrap(); - Feed::from_channel_source(chan, s.id()) + FeedBuilder::default() + .channel(chan) + .source_id(s.id()) + .build() + .unwrap() }) .collect(); diff --git a/hammond-data/src/lib.rs b/hammond-data/src/lib.rs index 975bcf9..e864670 100644 --- a/hammond-data/src/lib.rs +++ b/hammond-data/src/lib.rs @@ -64,7 +64,7 @@ mod feed; mod parser; mod schema; -pub use feed::Feed; +pub use feed::{Feed, FeedBuilder}; pub use models::{Episode, EpisodeWidgetQuery, Podcast, PodcastCoverQuery, Source}; /// [XDG Base Direcotory](https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html) Paths. diff --git a/hammond-data/src/models/source.rs b/hammond-data/src/models/source.rs index f08f2eb..96bbf38 100644 --- a/hammond-data/src/models/source.rs +++ b/hammond-data/src/models/source.rs @@ -12,7 +12,7 @@ use futures::prelude::*; use database::connection; use errors::*; -use feed::Feed; +use feed::{Feed, FeedBuilder}; use models::NewSource; use schema::source; @@ -125,7 +125,13 @@ impl Source { Ok(res) }) .and_then(response_to_channel) - .map(move |chan| Feed::from_channel_source(chan, id)); + .map(move |chan| { + FeedBuilder::default() + .channel(chan) + .source_id(id) + .build() + .unwrap() + }); Box::new(feed) }