redact_core/recognizers/
mod.rs1pub mod pattern;
6pub mod registry;
7pub mod validation;
8
9pub use registry::RecognizerRegistry;
10pub use validation::validate_entity;
11
12use crate::types::{EntityType, RecognizerResult};
13use anyhow::Result;
14use std::fmt::Debug;
15
16pub trait Recognizer: Send + Sync + Debug {
18 fn name(&self) -> &str;
20
21 fn supported_entities(&self) -> &[EntityType];
23
24 fn analyze(&self, text: &str, language: &str) -> Result<Vec<RecognizerResult>>;
26
27 fn min_score(&self) -> f32 {
29 0.0
30 }
31
32 fn supports_language(&self, language: &str) -> bool {
34 language == "en" }
36}
37
38pub trait ConfigurableRecognizer: Recognizer {
40 type Config;
42
43 fn from_config(config: Self::Config) -> Result<Self>
45 where
46 Self: Sized;
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52
53 #[derive(Debug)]
54 struct TestRecognizer;
55
56 impl Recognizer for TestRecognizer {
57 fn name(&self) -> &str {
58 "test"
59 }
60
61 fn supported_entities(&self) -> &[EntityType] {
62 &[EntityType::Person]
63 }
64
65 fn analyze(&self, _text: &str, _language: &str) -> Result<Vec<RecognizerResult>> {
66 Ok(vec![])
67 }
68 }
69
70 #[test]
71 fn test_recognizer_trait() {
72 let recognizer = TestRecognizer;
73 assert_eq!(recognizer.name(), "test");
74 assert_eq!(recognizer.supported_entities(), &[EntityType::Person]);
75 assert!(recognizer.supports_language("en"));
76 assert!(!recognizer.supports_language("es"));
77 }
78}