use crate::{SubstitutionError, SubstitutionPolicy};
#[derive(Debug)]
pub struct PatternWhitelistPolicy {
pattern: regex::Regex,
pattern_str: String,
}
impl PatternWhitelistPolicy {
pub fn new(pattern: String) -> Result<Self, String> {
regex::Regex::new(&pattern)
.map(|regex| Self {
pattern: regex,
pattern_str: pattern,
})
.map_err(|e| format!("Invalid regex pattern: {}", e))
}
pub fn pattern(&self) -> &str {
&self.pattern_str
}
}
impl SubstitutionPolicy for PatternWhitelistPolicy {
fn validate(&self, var_name: &str) -> Result<(), SubstitutionError> {
if self.pattern.is_match(var_name) {
Ok(())
} else {
Err(SubstitutionError::VariableRejected {
var_name: var_name.to_string(),
reason: format!("does not match pattern: {}", self.pattern()),
policy: self.description(),
})
}
}
fn description(&self) -> String {
format!("PatternWhitelist({})", self.pattern())
}
}