summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.rs14
-rw-r--r--src/manager.rs26
-rw-r--r--src/status.rs4
3 files changed, 35 insertions, 9 deletions
diff --git a/src/main.rs b/src/main.rs
index b36e08f..48617b2 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -76,7 +76,13 @@ async fn main() {
76 Manager::default() 76 Manager::default()
77 }); 77 });
78 78
79 manager.add_feed(&url).await.print(); 79 let (status, errors): (Vec<_>, Vec<_>) = manager
80 .add_feeds_and_pull(&urls)
81 .await
82 .into_iter()
83 .partition(Result::is_ok);
84 status.iter().for_each(PrintResult::print);
85 errors.iter().for_each(PrintResult::print);
80 manager.store().print(); 86 manager.store().print();
81 } 87 }
82 Command::ListFeeds => { 88 Command::ListFeeds => {
@@ -107,7 +113,11 @@ async fn main() {
107 }); 113 });
108 let (status, errors): (Vec<_>, Vec<_>) = 114 let (status, errors): (Vec<_>, Vec<_>) =
109 manager.pull().await.into_iter().partition(Result::is_ok); 115 manager.pull().await.into_iter().partition(Result::is_ok);
110 status.iter().for_each(PrintResult::print); 116 status
117 .into_iter()
118 .map(Result::unwrap)
119 .filter(|s| !s.is_empty())
120 .for_each(|s| println!("{s}"));
111 errors.iter().for_each(PrintResult::print); 121 errors.iter().for_each(PrintResult::print);
112 manager.store().print(); 122 manager.store().print();
113 } 123 }
diff --git a/src/manager.rs b/src/manager.rs
index 5330d80..83e8c1b 100644
--- a/src/manager.rs
+++ b/src/manager.rs
@@ -13,8 +13,8 @@ pub struct Manager {
13} 13}
14 14
15impl Manager { 15impl Manager {
16 fn add_feed(&mut self, url: &str) -> Result<&mut Feed, Error> { 16 fn add_feed<P: AsRef<str>>(&mut self, url: P) -> Result<(), Error> {
17 let link = Url::parse(&url).map_err(|e| AddError::InvalidUrl(e.to_string()))?; 17 let link = Url::parse(url.as_ref()).map_err(|e| AddError::InvalidUrl(e.to_string()))?;
18 18
19 // check if this feed is already present 19 // check if this feed is already present
20 if self.feeds.iter().any(|f| f.link == link) { 20 if self.feeds.iter().any(|f| f.link == link) {
@@ -27,19 +27,31 @@ impl Manager {
27 // add new feed 27 // add new feed
28 self.feeds.push(feed); 28 self.feeds.push(feed);
29 29
30 Ok(self.feeds.last_mut().unwrap()) 30 Ok(())
31 } 31 }
32 32
33 pub async fn add_feed_and_pull(&mut self, url: &str) -> Result<PullStatus, Error> { 33 pub async fn add_feed_and_pull(&mut self, url: &str) -> Result<PullStatus, Error> {
34 let feed = self.add_feed(url)?; 34 self.add_feed(url)?;
35 let feed = self.feeds.last_mut().unwrap();
35 feed.pull() 36 feed.pull()
36 .await 37 .await
37 .map_err(|pull_err| Error::Pull(feed.link.clone(), pull_err)) 38 .map_err(|pull_err| Error::Pull(feed.link.clone(), pull_err))
38 } 39 }
39 40
40 pub async fn add_feeds_and_pull(&mut self, urls: &[&str]) -> Vec<Result<PullStatus, Error>> { 41 pub async fn add_feeds_and_pull<P: AsRef<str>>(
41 let add_results = urls.into_iter().map(|url| self.add_feed(&url)); 42 &mut self,
42 self.pull() 43 urls: &[P],
44 ) -> Vec<Result<PullStatus, Error>> {
45 for url in urls {
46 // TODO: handle this error
47 self.add_feed(&url);
48 }
49 futures::future::join_all(self.feeds.iter_mut().map(|feed| async {
50 feed.pull()
51 .await
52 .map_err(|pull_err| Error::Pull(feed.link.clone(), pull_err))
53 }))
54 .await
43 } 55 }
44 56
45 pub async fn pull(&mut self) -> Vec<Result<PullStatus, PullError>> { 57 pub async fn pull(&mut self) -> Vec<Result<PullStatus, PullError>> {
diff --git a/src/status.rs b/src/status.rs
index 205e2a9..4479a69 100644
--- a/src/status.rs
+++ b/src/status.rs
@@ -27,6 +27,10 @@ impl PullStatus {
27 27
28impl fmt::Display for PullStatus { 28impl fmt::Display for PullStatus {
29 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { 29 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
30 if self.is_empty() {
31 return Ok(());
32 }
33
30 write!( 34 write!(
31 f, 35 f,
32 "{}", 36 "{}",