use myrmic_common::db::{FindRequest, FindResponse, Measurement, PublishRequest, Scope, TsOrderBy};
use crate::{ApiError, ApiResult, db::MAX_SIZE_COMM_BUFFER, error::ErrorCode};
use alloc::string::String;
mod c_functions {
use core::ffi::c_int;
#[link(wasm_import_module = "db")]
unsafe extern "C" {
pub(super) fn publish_measurement(buffer: *const u8, length: c_int) -> c_int;
pub(super) fn find_measurement(
buffer_req: *const u8,
len_req: c_int,
buffer_rsp: *mut u8,
len_rsp: c_int,
) -> c_int;
}
}
pub fn publish_measurement(scope: Scope, measurement: Measurement) -> ApiResult<()> {
let mut request_buffer = [0u8; MAX_SIZE_COMM_BUFFER];
let payload = PublishRequest { scope, measurement };
let len = postcard::to_slice(&payload, &mut request_buffer)
.map_err(|_e| ApiError::Serde("serializing publish request"))?
.len();
unsafe { c_functions::publish_measurement(request_buffer.as_ptr(), len as i32) }.to_result()
}
#[allow(clippy::too_many_arguments)]
pub fn find_measurement(
scope: Scope,
measurement_name: String,
limit: Option<usize>,
start: Option<u64>,
end: Option<u64>,
order: Option<TsOrderBy>,
req_buffer: &mut [u8],
resp_buffer: &mut [u8],
) -> ApiResult<FindResponse> {
let find_request = FindRequest {
scope,
measurement_name,
limit,
start,
end,
order,
};
let req_len = postcard::to_slice(&find_request, req_buffer)
.map_err(|_err| ApiError::Serde("serializing find request"))?
.len();
unsafe {
c_functions::find_measurement(
req_buffer.as_ptr(),
req_len as i32,
resp_buffer.as_mut_ptr(),
resp_buffer.len() as i32,
)
}
.to_result()?;
let response = postcard::from_bytes::<FindResponse>(resp_buffer)
.map_err(|_err| ApiError::Serde("deserializing find response"))?;
Ok(response)
}