llam 0.1.2

Safe, Go-style Rust bindings for the LLAM runtime
use crate::error::{Error, Result};
use crate::sys;
use std::time::Duration;

pub fn now_ns() -> u64 {
    unsafe { sys::llam_now_ns() }
}

pub fn deadline_after(duration: Duration) -> u64 {
    now_ns().saturating_add(duration.as_nanos().min(u128::from(u64::MAX)) as u64)
}

pub fn sleep(duration: Duration) -> Result<()> {
    let ns = duration.as_nanos().min(u128::from(u64::MAX)) as u64;
    let rc = unsafe { sys::llam_sleep_ns(ns) };
    if rc == 0 {
        Ok(())
    } else {
        Err(Error::last())
    }
}

pub fn sleep_until(deadline_ns: u64) -> Result<()> {
    let rc = unsafe { sys::llam_sleep_until(deadline_ns) };
    if rc == 0 {
        Ok(())
    } else {
        Err(Error::last())
    }
}