From 05185f48e9fdf88fd465c5b673db33c77b50325f Mon Sep 17 00:00:00 2001 From: Mylloon Date: Mon, 1 Apr 2024 17:36:42 +0200 Subject: [PATCH] exclude empty directories --- src/routes/cours.rs | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/routes/cours.rs b/src/routes/cours.rs index 4bcafbc..bc3120b 100644 --- a/src/routes/cours.rs +++ b/src/routes/cours.rs @@ -1,6 +1,7 @@ use std::path::Path; use actix_web::{get, web, Responder}; +use cached::proc_macro::cached; use ramhorns::Content; use regex::Regex; use serde::{Deserialize, Serialize}; @@ -31,21 +32,23 @@ struct CoursTemplate { content: Option, } -#[derive(Debug, Serialize)] +#[derive(Debug, Serialize, Clone)] struct FileNode { name: String, is_dir: bool, children: Vec, } -fn compile_patterns(exclusion_list: &[String]) -> Vec { +#[cached] +fn compile_patterns(exclusion_list: Vec) -> Vec { exclusion_list .iter() .map(|pattern| Regex::new(pattern).unwrap()) .collect() } -fn get_filetree(dir_path: &str, exclusion_patterns: Vec) -> FileNode { +// #[once(time = 240)] +fn get_filetree(dir_path: &str, exclusion_patterns: &Vec) -> FileNode { let children = std::fs::read_dir(dir_path) .unwrap() .filter_map(Result::ok) @@ -65,10 +68,14 @@ fn get_filetree(dir_path: &str, exclusion_patterns: Vec) -> FileNode { children: vec![], }) } else { - Some(get_filetree( - entry_path.to_str().unwrap(), - exclusion_patterns.to_owned(), - )) + // Exclude empty directories + let children_of_children = + get_filetree(entry_path.to_str().unwrap(), exclusion_patterns); + if children_of_children.is_dir && children_of_children.children.is_empty() { + None + } else { + Some(children_of_children) + } } }) .collect(); @@ -109,13 +116,13 @@ fn get_content( ) } -// #[once(time = 60)] // TODO: Uncomment before release +// #[once(time = 60)] fn build_page(info: web::Query, config: Config) -> String { let cours_dir = "data/cours"; let exclusion_list = config.fc.exclude_courses.unwrap(); - let exclusion_patterns = compile_patterns(&exclusion_list); - let filetree = get_filetree(cours_dir, exclusion_patterns); + let exclusion_patterns = compile_patterns(exclusion_list.to_owned()); + let filetree = get_filetree(cours_dir, &exclusion_patterns); config.tmpl.render( "cours.html",