Skip to main content

cli/
preset_lint.rs

1//! Terminal adapter for Core-owned Preset lint reports.
2
3use crate::commands::PresetReportFormat;
4use anyhow::Result;
5use shine_core::runtime::{PresetLintReportV1, PresetLintSeverity};
6use std::path::Path;
7
8pub async fn handle_lint(
9    path: &Path,
10    format: PresetReportFormat,
11    deny_warnings: bool,
12) -> Result<bool> {
13    let cwd = std::env::current_dir().unwrap_or_else(|_| Path::new(".").to_path_buf());
14    let report =
15        shine_core::runtime::lint_preset_path(&shine_core::runtime::RealHost, &cwd, path).await;
16    match format {
17        PresetReportFormat::Text => print_text_report(&report),
18        PresetReportFormat::Json => println!("{}", serde_json::to_string_pretty(&report)?),
19    }
20    Ok(report.valid && (!deny_warnings || report.clean))
21}
22
23fn print_text_report(report: &PresetLintReportV1) {
24    println!(
25        "Preset lint: {}",
26        if !report.valid {
27            "invalid"
28        } else if report.clean {
29            "clean"
30        } else {
31            "warnings"
32        }
33    );
34    for diagnostic in &report.diagnostics {
35        let severity = match diagnostic.severity {
36            PresetLintSeverity::Error => "error",
37            PresetLintSeverity::Warning => "warning",
38        };
39        let target = diagnostic
40            .target
41            .as_deref()
42            .map(|target| format!(" {target}"))
43            .unwrap_or_default();
44        let resource = diagnostic
45            .resource
46            .as_deref()
47            .map(|resource| format!(" ยท {resource}"))
48            .unwrap_or_default();
49        println!(
50            "  {severity}[{}]:{}{} {}",
51            diagnostic.code, target, resource, diagnostic.message
52        );
53    }
54    println!(
55        "Summary: {} categories, {} errors, {} warnings",
56        report.summary.categories, report.summary.errors, report.summary.warnings
57    );
58}