Skip to main content

cloakpipe_core/detector/
custom.rs

1//! Layer 4: User-defined TOML pattern rules.
2
3use crate::{DetectedEntity, EntityCategory, DetectionSource, config::DetectionConfig};
4use anyhow::Result;
5use regex::Regex;
6
7pub struct CustomDetector {
8    rules: Vec<CustomRule>,
9}
10
11struct CustomRule {
12    _name: String,
13    regex: Regex,
14    category: EntityCategory,
15}
16
17impl CustomDetector {
18    pub fn new(config: &DetectionConfig) -> Result<Self> {
19        let mut rules = Vec::new();
20        for pattern in &config.custom.patterns {
21            rules.push(CustomRule {
22                _name: pattern.name.clone(),
23                regex: Regex::new(&pattern.regex)?,
24                category: EntityCategory::Custom(pattern.category.clone()),
25            });
26        }
27        Ok(Self { rules })
28    }
29
30    pub fn detect(&self, text: &str) -> Result<Vec<DetectedEntity>> {
31        let mut entities = Vec::new();
32        for rule in &self.rules {
33            for mat in rule.regex.find_iter(text) {
34                entities.push(DetectedEntity {
35                    original: mat.as_str().to_string(),
36                    start: mat.start(),
37                    end: mat.end(),
38                    category: rule.category.clone(),
39                    confidence: 1.0,
40                    source: DetectionSource::Custom,
41                });
42            }
43        }
44        Ok(entities)
45    }
46}