harn-vm 0.10.168

Async bytecode virtual machine for the Harn programming language
use std::collections::BTreeMap;

use super::CapturedRun;
use crate::value::{VmDictExt, VmValue};

/// Build the captured-command result, including interruption and verifier evidence.
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)
}