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