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.insert("status".to_string(), VmValue::Int(status));
result.insert("success".to_string(), VmValue::Bool(success));
result.insert("timed_out".to_string(), VmValue::Bool(run.timed_out));
result.insert("duration_ms".to_string(), VmValue::Int(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)
}