cloakpipe_core/detector/
custom.rs1use 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}