Skip to main content

rusty_commit/commands/
setup.rs

1use anyhow::Result;
2use colored::Colorize;
3use dialoguer::{Input, Select};
4
5use crate::cli::SetupCommand;
6use crate::config::Config;
7
8pub async fn execute(_cmd: SetupCommand) -> Result<()> {
9    println!();
10    println!(
11        "{} {}",
12        "🚀".green(),
13        "Rusty Commit Setup Wizard".bold().white()
14    );
15    println!();
16
17    // Step 1: Select AI Provider
18    let providers = [
19        "OpenAI (GPT-4, GPT-3.5)",
20        "Anthropic (Claude)",
21        "Google Gemini",
22        "Ollama (local)",
23    ];
24
25    let provider_selection = Select::new()
26        .with_prompt("1. Select your AI provider")
27        .items(providers)
28        .default(0)
29        .interact()?;
30
31    let (provider, default_model) = match provider_selection {
32        0 => ("openai", "gpt-4o-mini"),
33        1 => ("anthropic", "claude-3-5-haiku-20241022"),
34        2 => ("gemini", "gemini-1.5-flash"),
35        3 => ("ollama", "llama3.2"),
36        _ => ("openai", "gpt-4o-mini"),
37    };
38
39    println!();
40    println!("{} Selected: {}", "✓".green(), provider.yellow());
41
42    // Step 2: Enter API Key (skip for Ollama)
43    let api_key = if provider_selection == 3 {
44        println!();
45        println!(
46            "{} Local Ollama detected - API key not required",
47            "ℹ".blue()
48        );
49        None
50    } else {
51        println!();
52        let input: String = Input::new()
53            .with_prompt(format!("2. Enter your {} API key", provider))
54            .interact()?;
55        if input.trim().is_empty() {
56            println!(
57                "{} No API key entered - you'll need to set it later",
58                "⚠".yellow()
59            );
60        }
61        Some(input)
62    };
63
64    // Step 3: Select commit format
65    let commit_formats = ["Conventional (feat, fix, etc.)", "GitMoji (🎉, 🐛, ✨)"];
66    let format_selection = Select::new()
67        .with_prompt("3. Select commit message format")
68        .items(commit_formats)
69        .default(0)
70        .interact()?;
71
72    let commit_type = if format_selection == 0 {
73        "conventional"
74    } else {
75        "gitmoji"
76    };
77
78    println!();
79    println!("{} Selected format: {}", "✓".green(), commit_type.yellow());
80
81    // Save configuration
82    let mut config = Config::load()?;
83    config.ai_provider = Some(provider.to_string());
84    config.model = Some(default_model.to_string());
85    config.commit_type = Some(commit_type.to_string());
86    config.description_capitalize = Some(true);
87    config.description_add_period = Some(false);
88    config.generate_count = Some(1);
89
90    if let Some(key) = api_key {
91        if !key.trim().is_empty() {
92            config.api_key = Some(key);
93        }
94    }
95
96    config.save()?;
97
98    // Completion message
99    println!();
100    println!(
101        "{}",
102        "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━".dimmed()
103    );
104    println!();
105    println!("{} Setup complete!", "✓".green().bold());
106    println!();
107    println!("{} You can now run: {}", "→".cyan(), "rco".bold().white());
108    println!();
109    println!(
110        "{} To change settings later, use: {}",
111        "→".cyan(),
112        "rco config set <key>=<value>".bold().white()
113    );
114    println!(
115        "    Or run this setup again: {}",
116        "rco setup".bold().white()
117    );
118    println!();
119    println!(
120        "{}",
121        "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━".dimmed()
122    );
123
124    Ok(())
125}