From 9dafbae3d527e488fb309012064c9b44ac41e0cf Mon Sep 17 00:00:00 2001 From: Mylloon Date: Mon, 1 Apr 2024 16:55:50 +0200 Subject: [PATCH] optimizations --- src/routes/cours.rs | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/routes/cours.rs b/src/routes/cours.rs index 1f72197..4bcafbc 100644 --- a/src/routes/cours.rs +++ b/src/routes/cours.rs @@ -38,30 +38,37 @@ struct FileNode { children: Vec, } -fn get_filetree(dir_path: &str, exclusion_list: Vec) -> FileNode { - let children = std::fs::read_dir(dir_path).unwrap() +fn compile_patterns(exclusion_list: &[String]) -> Vec { + exclusion_list + .iter() + .map(|pattern| Regex::new(pattern).unwrap()) + .collect() +} + +fn get_filetree(dir_path: &str, exclusion_patterns: Vec) -> FileNode { + let children = std::fs::read_dir(dir_path) + .unwrap() .filter_map(Result::ok) .filter_map(|entry| { let entry_path = entry.path(); - let entry_name = entry_path.file_name()?.to_str()?; + let entry_name = entry_path.file_name()?.to_string_lossy().to_string(); // Exclude element with the exclusion_list - if exclusion_list.iter().any(|pattern| { - Regex::new(pattern) - .map(|re| re.is_match(entry_name)) - .unwrap_or(false) - }) { + if exclusion_patterns.iter().any(|re| re.is_match(&entry_name)) { return None; } if entry_path.is_file() { Some(FileNode { - name: entry_name.to_string(), + name: entry_name, is_dir: false, children: vec![], }) } else { - Some(get_filetree(entry_path.to_str().unwrap(), exclusion_list.clone())) + Some(get_filetree( + entry_path.to_str().unwrap(), + exclusion_patterns.to_owned(), + )) } }) .collect(); @@ -107,7 +114,8 @@ fn get_content( fn build_page(info: web::Query, config: Config) -> String { let cours_dir = "data/cours"; let exclusion_list = config.fc.exclude_courses.unwrap(); - let filetree = get_filetree(cours_dir, exclusion_list.to_owned()); + let exclusion_patterns = compile_patterns(&exclusion_list); + let filetree = get_filetree(cours_dir, exclusion_patterns); config.tmpl.render( "cours.html",