ai_code_buddy/core/
mod.rs1pub 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 let review_result = analysis::perform_analysis(&args)?;
27
28 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 ""
120 }
121 review::CommitStatus::Staged => {
122 ""
123 }
124 review::CommitStatus::Modified => {
125 ""
126 }
127 review::CommitStatus::Untracked => {
128 ""
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 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}