code-executor 2.7.0

A library designed for the backend of competitive programming platforms
Documentation
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>,
}