rust_diff_analyzer/output/
formatter.rs1use masterror::AppError;
5
6use super::{comment::format_comment, github::GithubFormatter, json::JsonFormatter};
7use crate::{
8 config::{Config, OutputFormat},
9 types::AnalysisResult,
10};
11
12pub trait Formatter {
14 fn format(&self, result: &AnalysisResult, config: &Config) -> Result<String, AppError>;
29}
30
31pub fn format_output(result: &AnalysisResult, config: &Config) -> Result<String, AppError> {
60 match config.output.format {
61 OutputFormat::Github => GithubFormatter.format(result, config),
62 OutputFormat::Json => JsonFormatter.format(result, config),
63 OutputFormat::Human => format_human(result, config),
64 OutputFormat::Comment => Ok(format_comment(result, config)),
65 }
66}
67
68fn format_human(result: &AnalysisResult, _config: &Config) -> Result<String, AppError> {
69 use std::fmt::Write;
70
71 let summary = &result.summary;
72 let mut output = String::new();
73
74 output.push_str("=== Rust Diff Analysis ===\n\n");
75
76 output.push_str("Production:\n");
77 let _ = writeln!(output, " Functions: {}", summary.prod_functions);
78 let _ = writeln!(output, " Structs: {}", summary.prod_structs);
79 let _ = writeln!(output, " Other: {}", summary.prod_other);
80 let _ = writeln!(
81 output,
82 " Lines: +{} -{}",
83 summary.prod_lines_added, summary.prod_lines_removed
84 );
85
86 output.push_str("\nTest:\n");
87 let _ = writeln!(output, " Units: {}", summary.test_units);
88 let _ = writeln!(
89 output,
90 " Lines: +{} -{}",
91 summary.test_lines_added, summary.test_lines_removed
92 );
93
94 let _ = writeln!(output, "\nWeighted score: {}", summary.weighted_score);
95
96 if summary.exceeds_limit {
97 output.push_str("\nLIMIT EXCEEDED\n");
98 }
99
100 if !result.changes.is_empty() {
101 output.push_str("\nChanges:\n");
102 for change in &result.changes {
103 let _ = writeln!(
104 output,
105 " - {} ({}) in {} [+{} -{}]",
106 change.unit.name,
107 change.unit.kind.as_str(),
108 change.file_path.display(),
109 change.lines_added,
110 change.lines_removed
111 );
112 }
113 }
114
115 Ok(output)
116}