text_processing_rs/
custom_rules.rs1use std::sync::RwLock;
10
11use lazy_static::lazy_static;
12
13lazy_static! {
14 static ref CUSTOM_RULES: RwLock<Vec<(String, String)>> = RwLock::new(Vec::new());
16}
17
18pub fn add_rule(spoken: &str, written: &str) {
23 let spoken_lower = spoken.to_lowercase();
24 let mut rules = CUSTOM_RULES.write().unwrap();
25 if let Some(entry) = rules.iter_mut().find(|(s, _)| *s == spoken_lower) {
27 entry.1 = written.to_string();
28 } else {
29 rules.push((spoken_lower, written.to_string()));
30 }
31}
32
33pub fn remove_rule(spoken: &str) -> bool {
37 let spoken_lower = spoken.to_lowercase();
38 let mut rules = CUSTOM_RULES.write().unwrap();
39 let len_before = rules.len();
40 rules.retain(|(s, _)| *s != spoken_lower);
41 rules.len() < len_before
42}
43
44pub fn clear_rules() {
46 let mut rules = CUSTOM_RULES.write().unwrap();
47 rules.clear();
48}
49
50pub fn parse(input: &str) -> Option<String> {
54 let input_lower = input.to_lowercase();
55 let input_trimmed = input_lower.trim();
56
57 let rules = CUSTOM_RULES.read().unwrap();
58 for (spoken, written) in rules.iter() {
59 if input_trimmed == spoken {
60 return Some(written.clone());
61 }
62 }
63
64 None
65}
66
67pub fn rule_count() -> usize {
69 let rules = CUSTOM_RULES.read().unwrap();
70 rules.len()
71}
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76
77 #[test]
79 fn test_custom_rules() {
80 clear_rules();
81
82 add_rule("gee pee tee", "GPT");
84 assert_eq!(parse("gee pee tee"), Some("GPT".to_string()));
85 assert_eq!(parse("Gee Pee Tee"), Some("GPT".to_string()));
86 assert_eq!(parse("unknown"), None);
87
88 add_rule("gee pee tee", "GPT-4");
90 assert_eq!(parse("gee pee tee"), Some("GPT-4".to_string()));
91 assert_eq!(rule_count(), 1);
92
93 assert!(remove_rule("gee pee tee"));
95 assert_eq!(parse("gee pee tee"), None);
96 assert!(!remove_rule("gee pee tee"));
97
98 add_rule("alpha", "A");
100 add_rule("bravo", "B");
101 assert_eq!(rule_count(), 2);
102 assert_eq!(parse("alpha"), Some("A".to_string()));
103 assert_eq!(parse("bravo"), Some("B".to_string()));
104 clear_rules();
105 assert_eq!(rule_count(), 0);
106 assert_eq!(parse("alpha"), None);
107 }
108}