use std::collections::BTreeMap;
use super::CapturedRun;
use crate::value::{VmDictExt, VmValue};
pub(super) fn captured_run_to_value(run: &CapturedRun) -> VmValue {
let status = if run.timed_out || run.interrupted {
-1
} else {
run.output.status.code().unwrap_or(-1) as i64
};
let success = !run.timed_out && !run.interrupted && run.output.status.success();
let mut result = BTreeMap::new();
result.put_str(
"stdout",
String::from_utf8_lossy(&run.output.stdout).as_ref(),
);
result.put_str(
"stderr",
String::from_utf8_lossy(&run.output.stderr).as_ref(),
);
result.put_int("status", status);
result.put_bool("success", success);
result.put_bool("timed_out", run.timed_out);
result.put_int("duration_ms", run.duration_ms);
if let Some(receipt) = &run.verifier_receipt {
result.insert(
"verifier_receipt".into(),
crate::stdlib::json_to_vm_value(
&serde_json::to_value(receipt).expect("typed verifier receipt"),
),
);
}
VmValue::dict(result)
}