maslc 1.0.1

Maduka Authorization Specification Language (MASL) toolchain and runtime
use masl_diagnostics::diagnostic::Diagnostic;
use masl_diagnostics::severity::Severity;

/// Prints a list of diagnostics to stdout in a Rust-compiler–style format.
pub fn print_diagnostics(diags: &[Diagnostic], source: &str, filepath: &str) {
    for diag in diags {
        let severity_str = match diag.severity {
            Severity::Error => "error",
            Severity::Warning => "warning",
            Severity::Note => "note",
            Severity::Help => "help",
        };

        println!("{}[{}]: {}", severity_str, diag.code, diag.message);
        println!(
            "  --> {}:{}:{}",
            filepath, diag.primary.span.line, diag.primary.span.column
        );

        let lines: Vec<&str> = source.lines().collect();
        if diag.primary.span.line > 0 && diag.primary.span.line <= lines.len() {
            let line_idx = diag.primary.span.line - 1;
            let line = lines[line_idx];
            println!("   |");
            println!("{:4} | {}", diag.primary.span.line, line);
            println!(
                "   | {}{}",
                " ".repeat(diag.primary.span.column - 1),
                "^".repeat(
                    diag.primary
                        .span
                        .end
                        .saturating_sub(diag.primary.span.start)
                        .max(1)
                )
            );
        }

        if let Some(ref help) = diag.help {
            println!("   = help: {}", help);
        }
        println!();
    }
}