vyre-conform 0.1.0

Conformance suite for vyre backends — proves byte-identical output to CPU reference
Documentation
//! Trace renderers.

use serde_json::json;

use super::trace::TraceSnapshot;

/// Render a human-readable table for stderr.
#[inline]
pub fn render_human(trace: &TraceSnapshot) -> String {
    let mut out = String::from("layer op verdict duration_us\n");
    out.push_str("----- -- ------- -----------\n");
    for record in trace.layer_records() {
        out.push_str(&format!(
            "{:<5} {:<48} {:<7} {}\n",
            record.layer_id.as_deref().unwrap_or("-"),
            record.op_id.as_deref().unwrap_or("-"),
            record.verdict.as_deref().unwrap_or("-"),
            record.duration_us
        ));
    }
    out
}

/// Render Chrome tracing JSON accepted by `devtools://tracing`.
#[inline]
pub fn render_chrome(trace: &TraceSnapshot) -> Result<String, String> {
    let events: Vec<serde_json::Value> = trace
        .records
        .iter()
        .map(|record| {
            json!({
                "name": record.name,
                "cat": "vyre-conform",
                "ph": "X",
                "ts": record.start_us,
                "dur": record.duration_us,
                "pid": 1,
                "tid": record.thread_id,
                "args": {
                    "layer_id": record.layer_id,
                    "op_id": record.op_id,
                    "verdict": record.verdict
                }
            })
        })
        .collect();
    serde_json::to_string_pretty(&json!({ "traceEvents": events }))
        .map_err(|err| format!("Fix: failed to render chrome trace JSON: {err}"))
}

/// Render Inferno folded-stack samples, using span duration in microseconds.
#[inline]
pub fn render_flamegraph(trace: &TraceSnapshot) -> String {
    let mut out = String::new();
    for record in &trace.records {
        if record.duration_us == 0 {
            continue;
        }
        out.push_str(&record.stack.join(";"));
        out.push(' ');
        out.push_str(&record.duration_us.to_string());
        out.push('\n');
    }
    out
}