From d77769411822db7a68827d05b1c5a942f9d9080b Mon Sep 17 00:00:00 2001 From: Thomas Koch Date: Sun, 12 Jan 2025 11:23:31 +0200 Subject: [PATCH] generate a blogroll --- src/feed_store.rs | 19 +++++++++++++------ src/template_engine.rs | 6 +++--- templates/index.html | 15 ++++++++++++++- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/feed_store.rs b/src/feed_store.rs index 14fbb5a..f64a353 100644 --- a/src/feed_store.rs +++ b/src/feed_store.rs @@ -13,6 +13,8 @@ use ureq::http::Response; use ureq::Body; use url::Url; +const ENTRIES_LEN: usize = 10; + #[derive(Deserialize, Serialize, Default)] pub struct FetchData { pub etag: String, @@ -132,8 +134,9 @@ impl FeedStore { Ok(Some(parser.parse(BufReader::new(file))?)) } - pub fn collect(&self, feed_configs: &Vec) -> Vec { - let mut entries = vec![]; + pub fn collect(&self, feed_configs: &Vec) -> (Vec, Vec) { + let mut feeds = Vec::new(); + let mut entries = Vec::new(); for feed_config in feed_configs { let mut feed = match (|| { @@ -151,16 +154,20 @@ impl FeedStore { Ok(Some(f)) => f, }; - entries.append(&mut feed.entries); - // todo also trim mid-way when length > something, trading cpu for memory + entries.append(&mut std::mem::take(&mut feed.entries)); + feeds.push(feed); + // optimization to reduce memory usage + if entries.len() > 4 * ENTRIES_LEN { + entries = trim_entries(entries); + } } - trim_entries(entries) + (feeds, trim_entries(entries)) } } fn trim_entries(mut entries: Vec) -> Vec { entries.sort_by_key(|e| std::cmp::Reverse(e.updated.or(e.published).unwrap_or_default())); - entries.truncate(10); + entries.truncate(ENTRIES_LEN); entries } diff --git a/src/template_engine.rs b/src/template_engine.rs index b1d9bd8..827ac23 100644 --- a/src/template_engine.rs +++ b/src/template_engine.rs @@ -2,7 +2,6 @@ use crate::feed_store::FeedStore; use crate::to_checked_pathbuf; use crate::Config; use anyhow::Result; -use feed_rs::model::Entry; use std::fs::File; use tera::Tera; @@ -11,8 +10,9 @@ pub fn build(config: &Config, feed_store: &FeedStore) -> Result<()> { let out_dir = to_checked_pathbuf(&config.out_dir); let mut context = tera::Context::new(); - let feed_entries: Vec = feed_store.collect(&config.feeds); - context.insert("entries", &feed_entries); + let (feeds, entries) = feed_store.collect(&config.feeds); + context.insert("feeds", &feeds); + context.insert("entries", &entries); context.insert("PKG_AUTHORS", env!("CARGO_PKG_AUTHORS")); context.insert("PKG_HOMEPAGE", env!("CARGO_PKG_HOMEPAGE")); context.insert("PKG_NAME", env!("CARGO_PKG_NAME")); diff --git a/templates/index.html b/templates/index.html index 0b5c1f1..767bfa3 100644 --- a/templates/index.html +++ b/templates/index.html @@ -63,7 +63,20 @@