use core::ffi::c_int;
use core::time::Duration;
use postcard::experimental::max_size::MaxSize;
use crate::error::ErrorCode;
use crate::{ApiError, ApiResult};
mod c_functions {
use core::ffi::c_int;
#[link(wasm_import_module = "time")]
unsafe extern "C" {
pub(super) fn wait_host(buffer: *const u8, length: c_int) -> i32;
pub(super) fn now_host(buffer: *mut u8, length: c_int) -> i32;
pub(super) fn uptime_host(buffer: *mut u8, length: c_int) -> i32;
}
}
pub fn wait(dur: Duration) -> ApiResult<()> {
let mut buf = [0; Duration::POSTCARD_MAX_SIZE];
postcard::to_slice(&dur, &mut buf).map_err(|_| ApiError::UnknownErrorCode(0))?;
unsafe { c_functions::wait_host(buf.as_ptr(), buf.len() as c_int).to_result() }
}
#[allow(clippy::cast_sign_loss)]
pub fn now() -> ApiResult<Duration> {
let mut buf = [0; Duration::POSTCARD_MAX_SIZE];
let status = unsafe { c_functions::now_host(buf.as_mut_ptr(), buf.len() as c_int) };
match status {
n if n >= 0 => {
postcard::from_bytes(&buf[..n as usize]).map_err(|_| ApiError::UnknownErrorCode(0))
}
code => Err(code.into()),
}
}
#[allow(clippy::cast_sign_loss)]
pub fn uptime() -> ApiResult<Duration> {
let mut buf = [0; Duration::POSTCARD_MAX_SIZE];
let status = unsafe { c_functions::uptime_host(buf.as_mut_ptr(), buf.len() as c_int) };
match status {
n if n >= 0 => {
postcard::from_bytes(&buf[..n as usize]).map_err(|_| ApiError::UnknownErrorCode(0))
}
code => Err(code.into()),
}
}