From 944fc385ad12a9ef1a3d2d46609fca6b2d07d54f Mon Sep 17 00:00:00 2001 From: Daan Boerlage Date: Sun, 28 Aug 2022 19:11:07 +0200 Subject: [PATCH] Add episode marker rule --- src/main.rs | 4 +++ src/rules/episode_marker.rs | 52 +++++++++++++++++++++++++++++++++++++ src/rules/mod.rs | 6 ++++- 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 src/rules/episode_marker.rs diff --git a/src/main.rs b/src/main.rs index df797fc..e26bae6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -102,6 +102,10 @@ fn lint_file_name(file: &DirEntry, filename: &str) -> ComplianceStatus { let captures = captures.unwrap(); + if let Some(reason) = EpisodeMarker::check(filename, &captures) { + return ComplianceStatus::NonCompliant(reason); + } + if let Some(reason) = HasEpisodeName::check(filename, &captures) { return ComplianceStatus::NonCompliant(reason); } diff --git a/src/rules/episode_marker.rs b/src/rules/episode_marker.rs new file mode 100644 index 0000000..05665a8 --- /dev/null +++ b/src/rules/episode_marker.rs @@ -0,0 +1,52 @@ +use regex::Captures; +use eyre::Result; +use super::*; + +pub struct EpisodeMarker {} +impl Rule for EpisodeMarker { + fn check(_filename: &str, captures: &Captures) -> Option { + match captures.name("seasonPrefix") { + Some(marker) => { + if marker.as_str() != "S" { + return Some(NonCompliantReason::InvalidEpisodeMarker("Season Prefix must be 'S'".to_string())) + } + } + None => return Some(NonCompliantReason::InvalidEpisodeMarker("No Season Prefix found".to_string())), + } + + match captures.name("episodePrefix") { + Some(marker) => { + if marker.as_str() != "E" { + return Some(NonCompliantReason::InvalidEpisodeMarker("Episode Prefix must be 'E'".to_string())) + } + } + None => return Some(NonCompliantReason::InvalidEpisodeMarker("No Episode Prefix found".to_string())), + } + + match captures.name("season") { + Some(marker) => { + let str = marker.as_str(); + if str.len() != 2 && str.len() != 3 { + return Some(NonCompliantReason::InvalidEpisodeMarker("Season should be annotated with either 2 or 3 digits".to_string())) + } + } + None => return Some(NonCompliantReason::InvalidEpisodeMarker("No Season digits found".to_string())), + } + + match captures.name("episode") { + Some(marker) => { + let str = marker.as_str(); + if str.len() != 2 && str.len() != 3 { + return Some(NonCompliantReason::InvalidEpisodeMarker("Episode should be annotated with either 2 or 3 digits".to_string())) + } + } + None => return Some(NonCompliantReason::InvalidEpisodeMarker("No Episode digits found".to_string())), + } + + return None + } + + fn fix(_filename: &str, _captures: &Captures) -> Result { + return Ok(FixStatus::NotImplemented) + } +} diff --git a/src/rules/mod.rs b/src/rules/mod.rs index b6fb919..d63c80a 100644 --- a/src/rules/mod.rs +++ b/src/rules/mod.rs @@ -2,11 +2,13 @@ use std::fmt::{Display, Formatter}; use regex::Captures; use eyre::Result; +mod episode_marker; mod has_fluff; mod has_dash_in_title; mod has_episode_name; mod missing_separator; +pub use episode_marker::EpisodeMarker; pub use has_fluff::HasFluff; pub use has_episode_name::HasEpisodeName; pub use has_dash_in_title::DashInTitle; @@ -16,7 +18,8 @@ pub enum NonCompliantReason { DashInTitle, MissingName, HasFluff, - MissingNameSeparator + MissingNameSeparator, + InvalidEpisodeMarker(String) } impl Display for NonCompliantReason { @@ -26,6 +29,7 @@ impl Display for NonCompliantReason { NonCompliantReason::MissingName => write!(f, "Missing episode name"), NonCompliantReason::HasFluff => write!(f, "Has fluff"), NonCompliantReason::MissingNameSeparator => write!(f, "Missing episode name separator"), + NonCompliantReason::InvalidEpisodeMarker(r) => write!(f, "Episode marker must be of format S00E00 - {}", r) } } }