diff --git a/src/template_engine.rs b/src/template_engine.rs index 32cd841..f015ee2 100644 --- a/src/template_engine.rs +++ b/src/template_engine.rs @@ -5,7 +5,7 @@ use anyhow::Result; use camino::Utf8Path; use feed_rs::model::Feed; use std::collections::HashMap; -use std::fs::File; +use std::fs::{copy, create_dir_all, File}; use tera::{from_value, Tera}; pub fn build(config: &Config, feed_store: &mut FeedStore) -> Result<()> { @@ -32,6 +32,35 @@ pub fn build(config: &Config, feed_store: &mut FeedStore) -> Result<()> { let file = File::create(format!("{out_dir}/{name}"))?; tera.render_to(name, &context, file)?; } + + // Copy static assets from theme, if any + if let Some(theme) = &config.theme { + let assets_dir = config.templates_dir.join(theme).join("assets"); + if assets_dir.is_dir() { + copy_assets(&assets_dir, &out_dir)?; + } + } + + Ok(()) +} + +/// Recursively copy assets from one dir to another +/// +/// Symlinks are ignored. +fn copy_assets(orig: &Utf8Path, dest: &Utf8Path) -> Result<()> { + if orig.is_dir() { + if !dest.is_dir() { + create_dir_all(dest)?; + } + + for entry in orig.read_dir_utf8()? { + let entry = entry?; + copy_assets(entry.path(), &dest.join(entry.file_name()))?; + } + } else if orig.is_file() { + copy(orig, dest)?; + } + Ok(()) }