unity-cli 0.11.1

Rust CLI for Unity Editor automation over the Unity TCP protocol
use serde_json::json;

use super::model::{Severity, Violation};
use super::runner::LintOutcome;

#[derive(Debug, Clone, Copy)]
pub enum ReportFormat {
    Text,
    Json,
}

pub fn render(outcome: &LintOutcome, format: ReportFormat, severity: Severity) -> String {
    match format {
        ReportFormat::Text => render_text(outcome, severity),
        ReportFormat::Json => render_json(outcome),
    }
}

fn render_text(outcome: &LintOutcome, severity: Severity) -> String {
    let mut out = String::new();
    for v in &outcome.violations {
        let label = match severity {
            Severity::Error => "error",
            Severity::Warning => "warning",
        };
        out.push_str(&format!(
            "{}: {} [{}] {}\n",
            v.path.display(),
            label,
            v.rule,
            v.message
        ));
    }
    out.push_str(&format!(
        "\n{} skills checked, {} violations\n",
        outcome.skills.len(),
        outcome.violations.len()
    ));
    out
}

fn render_json(outcome: &LintOutcome) -> String {
    let arr: Vec<_> = outcome
        .violations
        .iter()
        .map(|v: &Violation| {
            json!({
                "path": v.path,
                "rule": v.rule,
                "severity": v.severity,
                "skill": v.skill,
                "message": v.message,
            })
        })
        .collect();
    serde_json::to_string_pretty(&arr).unwrap_or_else(|_| "[]".to_string())
}