doum_cli/cli/
suggest.rs

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    // Handle empty suggestions
21    if response.suggestions.is_empty() {
22        println!("\n⚠️  No commands to suggest.\n");
23        return Ok(());
24    }
25
26    // Format command items for selection
27    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
36    copy_to_clipboard(&selected.cmd)?;
37
38    cliclack::outro("✅ Command copied to clipboard, Ctrl+V to paste it!")?;
39
40    Ok(())
41}
42
43/// Copy text to clipboard using arboard
44fn 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}