use serde_json::json;
use super::trace::TraceSnapshot;
#[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
}
#[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}"))
}
#[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
}