code_executor/
metrics.rs

1use std::{os::unix::process::ExitStatusExt, time::Duration};
2
3use nix::sys::signal::Signal;
4
5#[derive(Debug, PartialEq, Eq)]
6pub enum ExitStatus {
7    Success,
8    RuntimeError,
9    TimeLimitExceeded,
10    ResourceLimitExceeded,
11}
12
13impl From<std::process::ExitStatus> for ExitStatus {
14    fn from(raw: std::process::ExitStatus) -> Self {
15        if raw.success() {
16            return Self::Success;
17        }
18
19        match raw.signal().and_then(|raw| Signal::try_from(raw).ok()) {
20            Some(Signal::SIGKILL) => ExitStatus::ResourceLimitExceeded,
21            _ => Self::RuntimeError,
22        }
23    }
24}
25
26#[derive(Debug)]
27pub struct Metrics {
28    pub exit_status: ExitStatus,
29    pub run_time: Duration,
30    pub stdout: Vec<u8>,
31    pub stderr: Vec<u8>,
32}