dstest 0.1.6

Deterministic Simulation Testing for containerised services
use mlua::{Lua, Result, Table};

use crate::bindings::LuaModule;
use crate::engine::context::BindingContext;
use crate::substrate::Substrate;
use std::time::{SystemTime, UNIX_EPOCH};

pub struct Clock;

impl<S: Substrate> LuaModule<S> for Clock {
    fn register(lua: &Lua, dstest: &Table, _ctx: &BindingContext<S>) -> Result<()> {
        let clock_fn = lua.create_function(move |lua, _: ()| {
            let now = SystemTime::now()
                .duration_since(UNIX_EPOCH)
                .expect("time went backwards");

            let t = lua.create_table()?;
            t.set("nanos", now.as_nanos() as u64)?;
            t.set("micros", now.as_micros() as u64)?;
            t.set("millis", now.as_millis() as u64)?;
            t.set("secs", now.as_secs())?;

            Ok(t)
        })?;

        dstest.set("clock", clock_fn)?;
        Ok(())
    }
}