ai_code_buddy/core/
mod.rs

1pub mod ai_analyzer;
2pub mod analysis;
3pub mod credits;
4pub mod git;
5pub mod review;
6
7use crate::{
8    args::{Args, OutputFormat},
9    version::APP_VERSION,
10};
11use anyhow::Result;
12
13pub fn run_cli_mode(args: Args) -> Result<(), Box<dyn std::error::Error>> {
14    println!("šŸ” AI Code Review Tool v{APP_VERSION} (CLI Mode)");
15    println!("šŸ“‚ Repository: {}", args.repo_path);
16    println!(
17        "🌿 Comparing: {} → {}",
18        args.source_branch, args.target_branch
19    );
20
21    if args.show_credits {
22        show_credits();
23        return Ok(());
24    }
25
26    // Perform analysis
27    let review_result = analysis::perform_analysis(&args)?;
28
29    // Output results
30    match args.output_format {
31        OutputFormat::Summary => print_summary(&review_result),
32        OutputFormat::Detailed => print_detailed(&review_result),
33        OutputFormat::Json => print_json(&review_result)?,
34        OutputFormat::Markdown => print_markdown(&review_result),
35    }
36
37    Ok(())
38}
39
40fn show_credits() {
41    credits::display_comprehensive_credits();
42}
43
44fn print_summary(review: &review::Review) {
45    println!("\nšŸŽÆ Code Review Summary");
46    println!("==========================================");
47    println!("šŸ“ Files analyzed: {}", review.files_count);
48    println!("šŸ› Total issues: {}", review.issues_count);
49    println!("āš ļø  Severity breakdown:");
50    println!("  🚨 Critical: {}", review.critical_issues);
51    println!("  āš ļø  High: {}", review.high_issues);
52    println!("  šŸ”¶ Medium: {}", review.medium_issues);
53    println!("  ā„¹ļø  Low: {}", review.low_issues);
54}
55
56fn print_detailed(review: &review::Review) {
57    print_summary(review);
58    println!("\nšŸ” Detailed Analysis:");
59    println!("==========================================");
60    for issue in &review.issues {
61        let severity_icon = match issue.severity.as_str() {
62            "Critical" => "🚨",
63            "High" => "āš ļø",
64            "Medium" => "šŸ”¶",
65            "Low" => "ā„¹ļø",
66            _ => "šŸ’”",
67        };
68        let commit_icon = match issue.commit_status {
69            review::CommitStatus::Committed => "āœ…",
70            review::CommitStatus::Staged => "🟔",
71            review::CommitStatus::Modified => "šŸ”“",
72            review::CommitStatus::Untracked => "šŸ†•",
73        };
74        let status_text = match issue.commit_status {
75            review::CommitStatus::Committed => "committed",
76            review::CommitStatus::Staged => "staged",
77            review::CommitStatus::Modified => "modified",
78            review::CommitStatus::Untracked => "untracked",
79        };
80        println!(
81            "{} {} {} (Line {}) [{}]: {}",
82            severity_icon, commit_icon, issue.file, issue.line, status_text, issue.description
83        );
84    }
85}
86
87fn print_json(review: &review::Review) -> Result<()> {
88    let json = serde_json::to_string_pretty(review)?;
89    println!("{json}");
90    Ok(())
91}
92
93fn print_markdown(review: &review::Review) {
94    println!("# Code Review Report\n");
95    println!("## Summary\n");
96    println!("- **Files analyzed**: {}", review.files_count);
97    println!("- **Total issues**: {}", review.issues_count);
98    println!("- **Critical**: {}", review.critical_issues);
99    println!("- **High**: {}", review.high_issues);
100    println!("- **Medium**: {}", review.medium_issues);
101    println!("- **Low**: {}", review.low_issues);
102    println!("\n## Issues\n");
103    for issue in &review.issues {
104        let status_badge = match issue.commit_status {
105            review::CommitStatus::Committed => {
106                "![Committed](https://img.shields.io/badge/status-committed-green)"
107            }
108            review::CommitStatus::Staged => {
109                "![Staged](https://img.shields.io/badge/status-staged-yellow)"
110            }
111            review::CommitStatus::Modified => {
112                "![Modified](https://img.shields.io/badge/status-modified-red)"
113            }
114            review::CommitStatus::Untracked => {
115                "![Untracked](https://img.shields.io/badge/status-untracked-blue)"
116            }
117        };
118        println!(
119            "- **{}:{}** - {} - {} {} - {}",
120            issue.file, issue.line, issue.severity, status_badge, issue.category, issue.description
121        );
122    }
123}
124
125#[cfg(test)]
126mod tests {
127    use super::*;
128    use crate::core::review::{CommitStatus, Issue, Review};
129
130    fn sample_review() -> Review {
131        Review {
132            files_count: 1,
133            issues_count: 1,
134            critical_issues: 1,
135            high_issues: 0,
136            medium_issues: 0,
137            low_issues: 0,
138            issues: vec![Issue {
139                file: "src/lib.rs".into(),
140                line: 1,
141                severity: "Critical".into(),
142                category: "Security".into(),
143                description: "test".into(),
144                commit_status: CommitStatus::Committed,
145            }],
146        }
147    }
148
149    #[test]
150    fn test_print_functions() {
151        let r = sample_review();
152        // Ensure these don't panic
153        print_summary(&r);
154        print_detailed(&r);
155        print_markdown(&r);
156        assert!(print_json(&r).is_ok());
157    }
158
159    #[test]
160    fn test_show_credits() {
161        show_credits();
162    }
163}