rust_diff_analyzer/output/
github.rs

1// SPDX-FileCopyrightText: 2025 RAprogramm <andrey.rozanov.vl@gmail.com>
2// SPDX-License-Identifier: MIT
3
4use masterror::AppError;
5
6use super::formatter::Formatter;
7use crate::{config::Config, types::AnalysisResult};
8
9/// Formatter for GitHub Actions output
10pub struct GithubFormatter;
11
12impl Formatter for GithubFormatter {
13    fn format(&self, result: &AnalysisResult, _config: &Config) -> Result<String, AppError> {
14        let mut output = String::new();
15
16        output.push_str(&format!(
17            "prod_functions_changed={}\n",
18            result.summary.prod_functions
19        ));
20        output.push_str(&format!(
21            "prod_structs_changed={}\n",
22            result.summary.prod_structs
23        ));
24        output.push_str(&format!(
25            "prod_other_changed={}\n",
26            result.summary.prod_other
27        ));
28        output.push_str(&format!(
29            "test_units_changed={}\n",
30            result.summary.test_units
31        ));
32        output.push_str(&format!(
33            "prod_lines_added={}\n",
34            result.summary.prod_lines_added
35        ));
36        output.push_str(&format!(
37            "prod_lines_removed={}\n",
38            result.summary.prod_lines_removed
39        ));
40        output.push_str(&format!(
41            "test_lines_added={}\n",
42            result.summary.test_lines_added
43        ));
44        output.push_str(&format!(
45            "test_lines_removed={}\n",
46            result.summary.test_lines_removed
47        ));
48        output.push_str(&format!(
49            "weighted_score={}\n",
50            result.summary.weighted_score
51        ));
52        output.push_str(&format!("exceeds_limit={}\n", result.summary.exceeds_limit));
53
54        Ok(output)
55    }
56}
57
58#[cfg(test)]
59mod tests {
60    use super::*;
61    use crate::types::{AnalysisScope, Summary};
62
63    #[test]
64    fn test_github_format() {
65        let result = AnalysisResult::new(
66            vec![],
67            Summary {
68                prod_functions: 5,
69                prod_structs: 2,
70                prod_other: 1,
71                test_units: 10,
72                prod_lines_added: 50,
73                prod_lines_removed: 20,
74                test_lines_added: 100,
75                test_lines_removed: 30,
76                weighted_score: 23,
77                exceeds_limit: false,
78            },
79            AnalysisScope::new(),
80        );
81
82        let config = Config::default();
83        let output = GithubFormatter
84            .format(&result, &config)
85            .expect("format should succeed");
86
87        assert!(output.contains("prod_functions_changed=5"));
88        assert!(output.contains("prod_structs_changed=2"));
89        assert!(output.contains("prod_lines_added=50"));
90        assert!(output.contains("prod_lines_removed=20"));
91        assert!(output.contains("test_lines_added=100"));
92        assert!(output.contains("weighted_score=23"));
93        assert!(output.contains("exceeds_limit=false"));
94    }
95}