1use crate::core::handle_suggest;
2use crate::llm::create_client;
3use crate::system::{get_system_info, load_config};
4use anyhow::Result;
5
6pub async fn handle_suggest_command(request: &str) -> Result<()> {
7 use cliclack::{select, spinner};
8
9 let config = load_config()?;
10 let client = create_client(&config.llm)?;
11 let system_info = get_system_info();
12
13 let sp = spinner();
14 sp.start("AI is generating commands...");
15
16 let response = handle_suggest(request, client.as_ref(), &system_info, &config).await?;
17
18 sp.stop("â
Commands ready");
19
20 if response.suggestions.is_empty() {
22 println!("\nâ ď¸ No commands to suggest.\n");
23 return Ok(());
24 }
25
26 let items: Vec<_> = response
28 .suggestions
29 .iter()
30 .map(|s| (s, s.cmd.as_str(), s.description.as_str()))
31 .collect();
32
33 let selected = select("Select a command").items(&items).interact()?;
34
35 copy_to_clipboard(&selected.cmd)?;
37
38 cliclack::outro("â
Command copied to clipboard!")?;
39
40 Ok(())
41}
42
43fn copy_to_clipboard(text: &str) -> Result<()> {
45 use arboard::Clipboard;
46
47 let mut clipboard =
48 Clipboard::new().map_err(|e| anyhow::anyhow!("Failed to initialize clipboard: {}", e))?;
49
50 clipboard
51 .set_text(text)
52 .map_err(|e| anyhow::anyhow!("Failed to copy to clipboard: {}", e))?;
53
54 Ok(())
55}