zerum 0.4.0

Deterministic Python code governance: ~75 checks, default/strict profiles, explain mode, optional Ruff orchestration
Documentation
use crate::core::Issue;
use crate::reporters::Reporter;
use anyhow::Result;
use std::fmt::Write as _;

pub struct HumanReporter;

impl Reporter for HumanReporter {
    fn report(&self, issues: &[Issue]) -> Result<String> {
        if issues.is_empty() {
            return Ok("No issues found.\n".to_string());
        }
        let mut out = String::new();
        for issue in issues {
            writeln!(
                out,
                "[{}] {} {}:{}:{}{}",
                issue.severity,
                issue.id,
                issue.file.display(),
                issue.line,
                issue.column,
                issue.message
            )?;
            if let Some(explanation) = &issue.explanation {
                writeln!(out, "  explanation: {explanation}")?;
            }
            if let Some(remediation) = &issue.remediation {
                writeln!(out, "  remediation: {remediation}")?;
            }
        }
        Ok(out)
    }
}