git_iris/commit/
review.rs

1use 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
10/// Handles the review command which generates an AI code review of staged changes
11pub async fn handle_review_command(common: CommonParams, _print: bool) -> Result<()> {
12    // Check if the preset is appropriate for code reviews
13    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            &current_dir.clone(),
30            provider_name,
31            false, // gitmoji not needed for review
32            false, // verification not needed for review
33        )
34        .context("Failed to create IrisCommitService")?,
35    );
36
37    // Check environment prerequisites
38    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    // Create and start the spinner
63    let spinner = ui::create_spinner("");
64    let random_message = messages::get_waiting_message();
65    spinner.set_message(random_message.text);
66
67    // Generate the code review
68    let review = service
69        .generate_review(preset_str, &effective_instructions)
70        .await?;
71
72    // Stop the spinner
73    spinner.finish_and_clear();
74
75    // Print the review to stdout or save to file if requested
76    println!("{}", review.format());
77
78    Ok(())
79}