pub mod ai_analyzer;
pub mod analysis;
pub mod credits;
pub mod git;
pub mod review;
use crate::{
args::{Args, OutputFormat},
version::APP_VERSION,
};
use anyhow::Result;
pub fn run_cli_mode(args: Args) -> Result<(), Box<dyn std::error::Error>> {
println!("đ AI Code Review Tool v{APP_VERSION} (CLI Mode)");
println!("đ Repository: {}", args.repo_path);
println!(
"đŋ Comparing: {} â {}",
args.source_branch, args.target_branch
);
if args.show_credits {
show_credits();
return Ok(());
}
let review_result = analysis::perform_analysis(&args)?;
match args.output_format {
OutputFormat::Summary => print_summary(&review_result),
OutputFormat::Detailed => print_detailed(&review_result),
OutputFormat::Json => print_json(&review_result)?,
OutputFormat::Markdown => print_markdown(&review_result),
}
Ok(())
}
fn show_credits() {
credits::display_comprehensive_credits();
}
fn print_summary(review: &review::Review) {
println!("\nđ¯ Code Review Summary");
println!("==========================================");
println!("đ Files analyzed: {}", review.files_count);
println!("đ Total issues: {}", review.issues_count);
println!("â ī¸ Severity breakdown:");
println!(" đ¨ Critical: {}", review.critical_issues);
println!(" â ī¸ High: {}", review.high_issues);
println!(" đļ Medium: {}", review.medium_issues);
println!(" âšī¸ Low: {}", review.low_issues);
}
fn print_detailed(review: &review::Review) {
print_summary(review);
println!("\nđ Detailed Analysis:");
println!("==========================================");
for issue in &review.issues {
let severity_icon = match issue.severity.as_str() {
"Critical" => "đ¨",
"High" => "â ī¸",
"Medium" => "đļ",
"Low" => "âšī¸",
_ => "đĄ",
};
let commit_icon = match issue.commit_status {
review::CommitStatus::Committed => "â
",
review::CommitStatus::Staged => "đĄ",
review::CommitStatus::Modified => "đ´",
review::CommitStatus::Untracked => "đ",
};
let status_text = match issue.commit_status {
review::CommitStatus::Committed => "committed",
review::CommitStatus::Staged => "staged",
review::CommitStatus::Modified => "modified",
review::CommitStatus::Untracked => "untracked",
};
println!(
"{} {} {} (Line {}) [{}]: {}",
severity_icon, commit_icon, issue.file, issue.line, status_text, issue.description
);
}
}
fn print_json(review: &review::Review) -> Result<()> {
let json = serde_json::to_string_pretty(review)?;
println!("{json}");
Ok(())
}
fn print_markdown(review: &review::Review) {
println!("# Code Review Report\n");
println!("## Summary\n");
println!("- **Files analyzed**: {}", review.files_count);
println!("- **Total issues**: {}", review.issues_count);
println!("- **Critical**: {}", review.critical_issues);
println!("- **High**: {}", review.high_issues);
println!("- **Medium**: {}", review.medium_issues);
println!("- **Low**: {}", review.low_issues);
println!("\n## Issues\n");
for issue in &review.issues {
let status_badge = match issue.commit_status {
review::CommitStatus::Committed => {
""
}
review::CommitStatus::Staged => {
""
}
review::CommitStatus::Modified => {
""
}
review::CommitStatus::Untracked => {
""
}
};
println!(
"- **{}:{}** - {} - {} {} - {}",
issue.file, issue.line, issue.severity, status_badge, issue.category, issue.description
);
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::review::{CommitStatus, Issue, Review};
fn sample_review() -> Review {
Review {
files_count: 1,
issues_count: 1,
critical_issues: 1,
high_issues: 0,
medium_issues: 0,
low_issues: 0,
issues: vec![Issue {
file: "src/lib.rs".into(),
line: 1,
severity: "Critical".into(),
category: "Security".into(),
description: "test".into(),
commit_status: CommitStatus::Committed,
}],
}
}
#[test]
fn test_print_functions() {
let r = sample_review();
print_summary(&r);
print_detailed(&r);
print_markdown(&r);
assert!(print_json(&r).is_ok());
}
#[test]
fn test_show_credits() {
show_credits();
}
}