agent_air_tui/commands/
helpers.rs1use super::traits::SlashCommand;
4
5pub fn is_slash_command(input: &str) -> bool {
14 input.starts_with('/')
15}
16
17pub fn parse_command(input: &str) -> Option<(&str, &str)> {
27 if !is_slash_command(input) {
28 return None;
29 }
30
31 let trimmed = input.trim_start_matches('/');
32 let mut parts = trimmed.splitn(2, ' ');
33 let name = parts.next()?;
34 let args = parts.next().unwrap_or("").trim();
35
36 Some((name, args))
37}
38
39pub fn filter_commands<'a>(
50 commands: &'a [Box<dyn SlashCommand>],
51 input: &str,
52) -> Vec<&'a dyn SlashCommand> {
53 let search_term = input.trim_start_matches('/').to_lowercase();
54
55 commands
56 .iter()
57 .filter(|cmd| cmd.name().to_lowercase().starts_with(&search_term))
58 .map(|c| c.as_ref())
59 .collect()
60}
61
62pub fn get_command_by_name<'a>(
66 commands: &'a [Box<dyn SlashCommand>],
67 name: &str,
68) -> Option<&'a dyn SlashCommand> {
69 let name = name.trim_start_matches('/');
70 commands
71 .iter()
72 .find(|cmd| cmd.name() == name)
73 .map(|c| c.as_ref())
74}
75
76pub fn generate_help_message(commands: &[Box<dyn SlashCommand>]) -> String {
78 let mut help = String::from("Available commands:\n\n");
79
80 for cmd in commands {
81 help.push_str(&format!(" /{} - {}\n", cmd.name(), cmd.description()));
82 }
83
84 help
85}
86
87#[cfg(test)]
88mod tests {
89 use super::*;
90
91 #[test]
92 fn test_is_slash_command() {
93 assert!(is_slash_command("/help"));
94 assert!(is_slash_command("/"));
95 assert!(!is_slash_command("help"));
96 assert!(!is_slash_command(""));
97 }
98
99 #[test]
100 fn test_parse_command() {
101 assert_eq!(parse_command("/help"), Some(("help", "")));
102 assert_eq!(
103 parse_command("/echo hello world"),
104 Some(("echo", "hello world"))
105 );
106 assert_eq!(
107 parse_command("/cmd spaced args"),
108 Some(("cmd", "spaced args"))
109 );
110 assert_eq!(parse_command("not a command"), None);
111 assert_eq!(parse_command(""), None);
112 }
113}