1use 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}