syncable_cli/analyzer/kubelint/formatter/
plain.rs

1//! Plain text formatter.
2
3use crate::analyzer::kubelint::lint::LintResult;
4
5/// Format a lint result as plain text.
6pub fn format(result: &LintResult) -> String {
7    let mut output = String::new();
8
9    for failure in &result.failures {
10        let location = match failure.line {
11            Some(line) => format!("{}:{}", failure.file_path.display(), line),
12            None => failure.file_path.display().to_string(),
13        };
14
15        output.push_str(&format!(
16            "{}: [{}] {} ({}/{}) - {}\n",
17            location,
18            failure.severity,
19            failure.code,
20            failure.object_kind,
21            failure.object_name,
22            failure.message,
23        ));
24
25        if let Some(ref remediation) = failure.remediation {
26            output.push_str(&format!("  Remediation: {}\n", remediation));
27        }
28    }
29
30    if result.failures.is_empty() {
31        output.push_str("No lint errors found.\n");
32    } else {
33        output.push_str(&format!("\nFound {} issue(s).\n", result.failures.len()));
34    }
35
36    output
37}
38
39/// Format for GitHub Actions annotations.
40pub fn format_github(result: &LintResult) -> String {
41    let mut output = String::new();
42
43    for failure in &result.failures {
44        let level = match failure.severity {
45            crate::analyzer::kubelint::types::Severity::Error => "error",
46            crate::analyzer::kubelint::types::Severity::Warning => "warning",
47            crate::analyzer::kubelint::types::Severity::Info => "notice",
48        };
49
50        let file = failure.file_path.display();
51        let line = failure.line.unwrap_or(1);
52
53        output.push_str(&format!(
54            "::{}file={},line={}::[{}] {} - {}\n",
55            level, file, line, failure.code, failure.object_name, failure.message,
56        ));
57    }
58
59    output
60}