ai_code_buddy/core/
mod.rs1pub 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 let review_result = analysis::perform_analysis(&args)?;
28
29 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 ""
107 }
108 review::CommitStatus::Staged => {
109 ""
110 }
111 review::CommitStatus::Modified => {
112 ""
113 }
114 review::CommitStatus::Untracked => {
115 ""
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 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}