dstest 0.1.5

Deterministic Simulation Testing for containerised services
use std::sync::Arc;

use mlua::{Lua, Result, Table};

use crate::engine::context::BindingContext;
use crate::substrate::{ContainerState, Subject, Substrate};

pub fn register<S: Substrate>(lua: &Lua, dstest: &Table, ctx: &BindingContext<S>) -> Result<()> {
    let substrate = Arc::clone(&ctx.substrate);

    let inspect_fn = lua.create_function(move |lua, id: String| {
        let subject = Subject::new(id);

        let info = substrate
            .inspect(&subject)
            .map_err(mlua::Error::RuntimeError)?;

        let t = lua.create_table()?;
        t.set(
            "state",
            match info.state {
                ContainerState::Running => "running",
                ContainerState::Paused => "paused",
                ContainerState::Exited => "exited",
                ContainerState::Dead => "dead",
            },
        )?;
        t.set("pid", info.pid)?;
        t.set("ip", info.ip)?;
        t.set("memory_limit", info.memory_limit)?;
        t.set("cpu_quota", info.cpu_quota)?;

        Ok(t)
    })?;

    dstest.set("inspect", inspect_fn)?;
    Ok(())
}