zerum 0.4.0

Deterministic Python code governance: ~75 checks, default/strict profiles, explain mode, optional Ruff orchestration
Documentation
pub mod human;
pub mod json;
#[cfg(feature = "sarif")]
pub mod sarif;

use crate::core::Issue;
use anyhow::Result;

#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub enum ReportKind {
    #[default]
    Human,
    Json,
    #[cfg(feature = "sarif")]
    Sarif,
}

pub trait Reporter {
    fn report(&self, issues: &[Issue]) -> Result<String>;
}

pub fn render(kind: ReportKind, issues: &[Issue]) -> Result<String> {
    match kind {
        ReportKind::Human => human::HumanReporter.report(issues),
        ReportKind::Json => json::JsonReporter.report(issues),
        #[cfg(feature = "sarif")]
        ReportKind::Sarif => sarif::SarifReporter.report(issues),
    }
}