use std::{os::unix::process::ExitStatusExt, time::Duration};
use nix::sys::signal::Signal;
#[derive(Debug, PartialEq, Eq)]
pub enum ExitStatus {
Success,
RuntimeError,
TimeLimitExceeded,
ResourceLimitExceeded,
}
impl From<std::process::ExitStatus> for ExitStatus {
fn from(raw: std::process::ExitStatus) -> Self {
if raw.success() {
return Self::Success;
}
match raw.signal().and_then(|raw| Signal::try_from(raw).ok()) {
Some(Signal::SIGKILL) => ExitStatus::ResourceLimitExceeded,
_ => Self::RuntimeError,
}
}
}
#[derive(Debug)]
pub struct Metrics {
pub exit_status: ExitStatus,
pub run_time: Duration,
pub stdout: Vec<u8>,
pub stderr: Vec<u8>,
}