use crate::cache::TemplateSourceMatcher;
use regex::Regex;
pub struct PathRegexMatcher {
pattern: Regex,
}
impl PathRegexMatcher {
pub fn new(regex: &str) -> Self {
if regex.starts_with('/') {
panic!("Absolute template paths need no inital \"/\"; remove it from: {regex}");
}
let anchored = format!("^(?:{regex})$");
PathRegexMatcher {
pattern: Regex::new(&anchored)
.unwrap_or_else(|e| panic!("invalid path regex \"{regex}\": {e}")),
}
}
}
impl TemplateSourceMatcher for PathRegexMatcher {
fn matches(&self, source_name: &str) -> bool {
self.pattern.is_match(source_name)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn path_regex_matches() {
let m = PathRegexMatcher::new(r"^foo/.*\.ftl$");
assert!(m.matches("foo/a.ftl"));
assert!(!m.matches("bar/a.ftl"));
assert!(std::panic::catch_unwind(|| PathRegexMatcher::new("/abs.ftl")).is_err());
assert!(std::panic::catch_unwind(|| PathRegexMatcher::new("[")).is_err());
}
}