rusty_commit/commands/
setup.rs1use 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 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 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 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 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 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}