From e2c0a9b4c20f09a51cd32124732faf284302eb0f Mon Sep 17 00:00:00 2001 From: clerie Date: Sat, 26 Apr 2025 11:43:13 +0200 Subject: [PATCH] Skip feed entries which can't be read but continue --- src/main.rs | 51 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/src/main.rs b/src/main.rs index 56410b2..bc157a6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,10 @@ use clap::{ }; use feed_rs::{ parser::parse, - model::Feed, + model::{ + Entry, + Feed, + }, }; use reqwest::{ @@ -59,7 +62,6 @@ fn read_feed_file(path: &str) -> Result { continue; } let url = Url::parse(&line)?; - println!("{}", url); urls.push(url); } @@ -70,25 +72,48 @@ fn read_feed_file(path: &str) -> Result { }) } +fn make_feed_item(entry: Entry) -> Result { + Ok(FeedItem { + link: entry.links + .first() + .context("Unable to retrieve link from feed entry")? + .href + .clone(), + title: entry.title + .context("Unable to retrieve title from feed entry")? + .content + .clone(), + time: match entry.published { + Some(time) => Some(time), + None => entry.updated, + }, + }) +} + fn main() -> Result<()> { let cli = Cli::parse(); - let mut feed_items = Vec::new(); - let feed_file = read_feed_file(&cli.feeds)?; + let mut items: Vec = Vec::new(); + for feed_url in feed_file.urls { - feed_items.extend(fetch_feed(feed_url)?.entries); + println!("Loading feed {}", feed_url); + + let feed_entries = fetch_feed(feed_url)?.entries; + + for entry in feed_entries { + match make_feed_item(entry) { + Ok(item) => { + items.push(item); + }, + Err(e) => { + println!("\t{}, skipping", e); + }, + } + } } - let mut items: Vec = feed_items.into_iter().map(|item| FeedItem { - link: item.links.first().unwrap().href.clone(), - title: item.title.unwrap().content.clone(), - time: match item.published { - Some(time) => Some(time), - None => item.updated, - }, - }).collect(); items.sort_by(|a, b| a.time.unwrap_or(chrono::DateTime::UNIX_EPOCH).cmp(&b.time.unwrap_or(chrono::DateTime::UNIX_EPOCH)).reverse()); let mut out = String::new();