code-executor 1.0.1

A code runner library for online judge system
Documentation
use std::{io, time::Duration};

use byte_unit::Byte;
use cgroups_rs::fs::{Cgroup, cgroup_builder::CgroupBuilder, hierarchies};
use uuid::Uuid;

const PREFIX: &str = "judge";

#[derive(Clone, Copy, Hash)]
pub struct Resource {
    pub memory: Byte,
    pub cpu_quota: Duration,
    pub cpu_period: Duration,
}

impl Default for Resource {
    fn default() -> Self {
        Resource {
            memory: Byte::GIGABYTE,
            cpu_quota: Duration::from_millis(100),
            cpu_period: Duration::from_millis(100),
        }
    }
}

impl TryFrom<Resource> for Cgroup {
    type Error = io::Error;

    fn try_from(resource: Resource) -> Result<Self, Self::Error> {
        let builder = CgroupBuilder::new(&format!("{}/{}", PREFIX, Uuid::new_v4()));

        let memory = resource.memory.as_u64() as i64;
        let builder = builder
            .memory()
            .memory_swap_limit(0)
            .memory_soft_limit(memory)
            .memory_hard_limit(memory)
            .done();

        let quota = resource.cpu_quota.as_micros() as i64;
        let period = resource.cpu_period.as_micros() as u64;
        let builder = builder.cpu().quota(quota).period(period).done();

        let cgroup = builder
            .build(hierarchies::auto())
            .map_err(io::Error::other)?;
        Ok(cgroup)
    }
}