From 206070ed678d43deb617c633eade94ba75fb6f26 Mon Sep 17 00:00:00 2001 From: Daan Boerlage Date: Thu, 1 Sep 2022 01:49:17 +0200 Subject: [PATCH] WIP: rule collections instead of hardcoded rules --- src/main.rs | 44 ++++++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/main.rs b/src/main.rs index 3a148b5..c69085b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,7 +5,7 @@ mod utils; use std::fmt::{Display, Formatter}; use eyre::Result; use clap::Parser; -use regex::Regex; +use regex::{Captures, Regex}; use walkdir::{DirEntry, WalkDir}; use args::Args; @@ -109,6 +109,20 @@ fn check_file(file: DirEntry, stats: &mut Stats, ctx: &mut Context, regex: &Rege } } +const SERIES_RULES_WITHOUT_NAME: [fn(&str, &Captures) -> Option; 3] = [ + DashInTitle::check, + EpisodeMarker::check, + HasFluff::check, +]; + +const SERIES_RULES_WITH_NAME: [fn(&str, &Captures) -> Option; 5] = [ + DashInTitle::check, + EpisodeMarker::check, + HasFluff::check, + HasEpisodeName::check, + MissingNameSeparator::check +]; + fn lint_file_name(file: &DirEntry, filename: &str, regex: &Regex, episode_name: bool) -> ComplianceStatus { if let Some(ext) = file.path().extension() { if !VIDEO_EXTENSIONS.contains(&ext.to_str().unwrap()) { @@ -126,29 +140,19 @@ fn lint_file_name(file: &DirEntry, filename: &str, regex: &Regex, episode_name: let captures = captures.unwrap(); - if let Some(reason) = DashInTitle::check(filename, &captures) { - return ComplianceStatus::NonCompliant(reason); + if episode_name { + check_rules(SERIES_RULES_WITH_NAME, filename, &captures) + } else { + check_rules(SERIES_RULES_WITHOUT_NAME, filename, &captures) } +} - if let Some(reason) = EpisodeMarker::check(filename, &captures) { - return ComplianceStatus::NonCompliant(reason); - } - - if let Some(reason) = HasFluff::check(filename, &captures) { - return ComplianceStatus::NonCompliant(reason); - } - - if let Some(reason) = HasEpisodeName::check(filename, &captures) { - return if episode_name { - ComplianceStatus::NonCompliant(reason) - } else { - ComplianceStatus::Compliant +fn check_rules(validation_rules: [fn(&str, &Captures) -> Option; N], filename: &str, captures: &Captures) -> ComplianceStatus { + for rule in validation_rules { + if let Some(reason) = rule(filename, &captures) { + return ComplianceStatus::NonCompliant(reason); } } - if let Some(reason) = MissingNameSeparator::check(filename, &captures) { - return ComplianceStatus::NonCompliant(reason); - } - ComplianceStatus::Compliant } \ No newline at end of file