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}