git_iris/commit/
review.rs1use super::service::IrisCommitService;
2use crate::common::CommonParams;
3use crate::config::Config;
4use crate::instruction_presets::PresetType;
5use crate::messages;
6use crate::ui;
7use anyhow::{Context, Result};
8use std::sync::Arc;
9
10pub async fn handle_review_command(common: CommonParams, _print: bool) -> Result<()> {
12 if !common.is_valid_preset_for_type(PresetType::Review) {
14 ui::print_warning(
15 "The specified preset may not be suitable for code reviews. Consider using a review or general preset instead.",
16 );
17 ui::print_info("Run 'git-iris list-presets' to see available presets for reviews.");
18 }
19
20 let mut config = Config::load()?;
21 common.apply_to_config(&mut config)?;
22 let current_dir = std::env::current_dir()?;
23
24 let provider_name = &config.default_provider;
25
26 let service = Arc::new(
27 IrisCommitService::new(
28 config.clone(),
29 ¤t_dir.clone(),
30 provider_name,
31 false, false, )
34 .context("Failed to create IrisCommitService")?,
35 );
36
37 if let Err(e) = service.check_environment() {
39 ui::print_error(&format!("Error: {e}"));
40 ui::print_info("\nPlease ensure the following:");
41 ui::print_info("1. Git is installed and accessible from the command line.");
42 ui::print_info("2. You are running this command from within a Git repository.");
43 ui::print_info("3. You have set up your configuration using 'git-iris config'.");
44 return Err(e);
45 }
46
47 let git_info = service.get_git_info().await?;
48
49 if git_info.staged_files.is_empty() {
50 ui::print_warning(
51 "No staged changes. Please stage your changes before generating a review.",
52 );
53 ui::print_info("You can stage changes using 'git add <file>' or 'git add .'");
54 return Ok(());
55 }
56
57 let effective_instructions = common
58 .instructions
59 .unwrap_or_else(|| config.instructions.clone());
60 let preset_str = common.preset.as_deref().unwrap_or("");
61
62 let spinner = ui::create_spinner("");
64 let random_message = messages::get_waiting_message();
65 spinner.set_message(random_message.text);
66
67 let review = service
69 .generate_review(preset_str, &effective_instructions)
70 .await?;
71
72 spinner.finish_and_clear();
74
75 println!("{}", review.format());
77
78 Ok(())
79}