zerolaunch_plugin_api/plugin/
trigger.rs1pub fn keyword_trigger_match<'a>(keywords: &[String], raw_query: &'a str) -> Option<&'a str> {
18 let mut parts = raw_query.splitn(2, ' ');
19 let first = parts.next().unwrap_or("");
20 let rest = parts.next()?;
21 let first_lower = first.to_lowercase();
22 keywords
23 .iter()
24 .any(|kw| kw.to_lowercase() == first_lower)
25 .then_some(rest)
26}
27
28#[cfg(test)]
29mod tests {
30 use super::keyword_trigger_match;
31
32 #[test]
34 fn requires_space_separated_trigger() {
35 let keywords = vec!["fy".to_string()];
36 assert_eq!(keyword_trigger_match(&keywords, "fy hello"), Some("hello"));
37 assert_eq!(keyword_trigger_match(&keywords, "fy"), None);
38 assert_eq!(keyword_trigger_match(&keywords, "fyhello"), None);
39 assert_eq!(keyword_trigger_match(&keywords, "xx hello"), None);
40 }
41
42 #[test]
44 fn case_insensitive() {
45 let keywords = vec!["Translate".to_string()];
46 assert_eq!(keyword_trigger_match(&keywords, "translate hi"), Some("hi"));
47 assert_eq!(keyword_trigger_match(&keywords, "TRANSLATE hi"), Some("hi"));
48 }
49
50 #[test]
52 fn empty_keywords_never_match() {
53 assert_eq!(keyword_trigger_match(&[], "fy hello"), None);
54 }
55}