ai_code_buddy/core/
mod.rs

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