smartcalc_tauri/tokinizer/regex_tokinizer/
text.rs1use alloc::string::ToString;
8use alloc::borrow::ToOwned;
9use chrono::{Duration, Utc};
10use crate::config::SmartCalcConfig;
11use crate::types::{TokenType};
12use crate::tokinizer::{Tokinizer, read_currency};
13use crate::token::ui_token::{UiTokenType};
14use regex::{Regex};
15use crate::constants::ConstantType;
16
17pub fn text_regex_parser(config: &SmartCalcConfig, tokinizer: &mut Tokinizer, group_item: &[Regex]) {
18 for re in group_item.iter() {
19 for capture in re.captures_iter(&tokinizer.data.to_owned()) {
20 let text = capture.name("TEXT").unwrap().as_str();
21 if !text.trim().is_empty() {
22
23 if let Some(constant) = config.constant_pair.get(&tokinizer.language).unwrap().get(&text.to_string()) {
24
25 let token = match constant {
26 ConstantType::Today => Some(TokenType::Date(Utc::today().naive_utc(), config.get_time_offset())),
27 ConstantType::Tomorrow => Some(TokenType::Date(Utc::today().naive_utc() + Duration::days(1), config.get_time_offset())),
28 ConstantType::Yesterday => Some(TokenType::Date(Utc::today().naive_utc() + Duration::days(-1), config.get_time_offset())),
29 ConstantType::Now => Some(TokenType::Time(Utc::now().naive_utc(), config.get_time_offset())),
30 _ => None
31 };
32
33 if token.is_some() && tokinizer.add_token_from_match(&capture.get(0), token) {
34 tokinizer.add_uitoken_from_match(capture.get(0), UiTokenType::DateTime);
35 }
36 }
37
38 if tokinizer.add_token_from_match(&capture.get(0), Some(TokenType::Text(text.to_string()))) {
39 match read_currency(config, text) {
40 Some(_) => tokinizer.add_uitoken_from_match(capture.get(0), UiTokenType::Symbol1),
41 _ => tokinizer.add_uitoken_from_match(capture.get(0), UiTokenType::Text)
42 };
43 }
44 }
45 }
46 }
47}
48
49#[cfg(test)]
50#[test]
51fn text_test_1() {
52 use core::ops::Deref;
53 use crate::tokinizer::regex_tokinizer;
54 use crate::tokinizer::test::setup_tokinizer;
55 use crate::config::SmartCalcConfig;
56 use crate::session::Session;
57 let mut session = Session::new();
58 let config = SmartCalcConfig::default();
59 let mut tokinizer_mut = setup_tokinizer("erhan barış aysel barış test".to_string(), &mut session, &config);
60
61 regex_tokinizer(&mut tokinizer_mut);
62 let tokens = &tokinizer_mut.token_infos;
63
64 assert_eq!(tokens.len(), 5);
65 assert_eq!(tokens[0].start, 0);
66 assert_eq!(tokens[0].end, 5);
67 assert_eq!(tokens[0].token_type.borrow().deref(), &Some(TokenType::Text("erhan".to_string())));
68
69 assert_eq!(tokens[1].start, 6);
70 assert_eq!(tokens[1].end, 13);
71 assert_eq!(tokens[1].token_type.borrow().deref(), &Some(TokenType::Text("barış".to_string())));
72
73 assert_eq!(tokens[2].start, 14);
74 assert_eq!(tokens[2].end, 19);
75 assert_eq!(tokens[2].token_type.borrow().deref(), &Some(TokenType::Text("aysel".to_string())));
76
77 assert_eq!(tokens[3].start, 20);
78 assert_eq!(tokens[3].end, 27);
79 assert_eq!(tokens[3].token_type.borrow().deref(), &Some(TokenType::Text("barış".to_string())));
80
81 assert_eq!(tokens[4].start, 28);
82 assert_eq!(tokens[4].end, 32);
83 assert_eq!(tokens[4].token_type.borrow().deref(), &Some(TokenType::Text("test".to_string())));
84}
85
86#[cfg(test)]
87#[test]
88fn text_test_2() {
89 use core::ops::Deref;
90 use crate::tokinizer::regex_tokinizer;
91 use crate::tokinizer::test::setup_tokinizer;
92 use crate::config::SmartCalcConfig;
93 use crate::session::Session;
94 let mut session = Session::new();
95 let config = SmartCalcConfig::default();
96 let mut tokinizer_mut = setup_tokinizer("today now yesterday tomorrow".to_string(), &mut session, &config);
97
98 regex_tokinizer(&mut tokinizer_mut);
99 let tokens = &tokinizer_mut.token_infos;
100
101 let today = Utc::today().naive_utc();
102 let tomorrow = Utc::today().naive_utc() + Duration::days(1);
103 let yesterday = Utc::today().naive_utc() + Duration::days(-1);
104 let now = Utc::now().naive_utc();
105
106 assert_eq!(tokens.len(), 4);
107
108 assert_eq!(tokens[0].start, 0);
110 assert_eq!(tokens[0].end, 5);
111 let token = tokens[0].token_type.borrow().deref().clone();
112
113 if let Some(TokenType::Date(calculated_today, offset)) = token {
114 assert_eq!(offset, config.get_time_offset());
115 assert!(today.signed_duration_since(calculated_today).num_seconds().abs() < 5);
116 } else { assert!(false); }
117
118 assert_eq!(tokens[1].start, 6);
120 assert_eq!(tokens[1].end, 9);
121 let token = tokens[1].token_type.borrow().deref().clone();
122
123 if let Some(TokenType::Time(calculated_now, offset)) = token {
124 assert_eq!(offset, config.get_time_offset());
125 assert!(now.signed_duration_since(calculated_now).num_seconds().abs() < 5);
126 } else { assert!(false); }
127
128 assert_eq!(tokens[2].start, 10);
130 assert_eq!(tokens[2].end, 19);
131 let token = tokens[2].token_type.borrow().deref().clone();
132
133 if let Some(TokenType::Date(calculated_yesterday, offset)) = token {
134 assert_eq!(offset, config.get_time_offset());
135 assert!(yesterday.signed_duration_since(calculated_yesterday).num_seconds().abs() < 5);
136 } else { assert!(false); }
137
138 assert_eq!(tokens[3].start, 20);
140 assert_eq!(tokens[3].end, 28);
141 let token = tokens[3].token_type.borrow().deref().clone();
142
143 if let Some(TokenType::Date(calculated_tomorrow, offset)) = token {
144 assert_eq!(offset, config.get_time_offset());
145 assert!(tomorrow.signed_duration_since(calculated_tomorrow).num_seconds().abs() < 5);
146 } else { assert!(false); }
147}
148