1use crate::core::handle_suggest;
2use crate::llm::create_client;
3use crate::system::{get_system_info, load_config};
4use anyhow::Result;
5use arboard::Clipboard;
6use cliclack::{select, spinner};
7
8pub async fn handle_suggest_command(request: &str) -> Result<()> {
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("[SUGGEST MODE] Generating commands...");
15
16 let response = handle_suggest(request, client.as_ref(), &system_info, &config).await?;
17
18 sp.stop("");
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, Ctrl+V to paste it!")?;
39
40 Ok(())
41}
42
43fn copy_to_clipboard(text: &str) -> Result<()> {
45 let mut clipboard =
46 Clipboard::new().map_err(|e| anyhow::anyhow!("Failed to initialize clipboard: {}", e))?;
47
48 clipboard
49 .set_text(text)
50 .map_err(|e| anyhow::anyhow!("Failed to copy to clipboard: {}", e))?;
51
52 Ok(())
53}