use crate::{ApiError, ApiResult, error::ErrorCode};
use alloc::string::String;
use myrmic_common::db::{Scope, SelectRequest, SelectResponse, UpdateRequest};
mod c_functions {
use core::ffi::c_int;
#[link(wasm_import_module = "db")]
unsafe extern "C" {
pub(super) fn sem_update(buffer: *const u8, length: c_int) -> c_int;
pub(super) fn sem_select(
buffer_req: *const u8,
len_req: c_int,
buffer_rsp: *mut u8,
len_rsp: c_int,
) -> c_int;
}
}
const MAX_SIZE_SEM_BUFFER: usize = 1000;
pub fn sem_update(scope: Scope, query: String, base_iri: Option<String>) -> ApiResult<()> {
let mut request_buffer = [0u8; MAX_SIZE_SEM_BUFFER];
let payload = UpdateRequest {
scope,
query,
base_iri,
};
let len = postcard::to_slice(&payload, &mut request_buffer)
.map_err(|_e| ApiError::Serde("serializing update request"))?
.len();
unsafe { c_functions::sem_update(request_buffer.as_ptr(), len as i32) }.to_result()
}
pub fn sem_select(
scope: Scope,
query: String,
base_iri: Option<String>,
limit: Option<usize>,
skip: Option<usize>,
) -> ApiResult<SelectResponse> {
let mut request_buffer = [0u8; MAX_SIZE_SEM_BUFFER];
let mut response_buffer = [0u8; MAX_SIZE_SEM_BUFFER];
let request = SelectRequest {
scope,
query,
base_iri,
limit,
skip,
};
let payload_len = postcard::to_slice(&request, &mut request_buffer)
.map_err(|_e| ApiError::Serde("serializing select request"))?
.len();
unsafe {
c_functions::sem_select(
request_buffer.as_ptr(),
payload_len as i32,
response_buffer.as_mut_ptr(),
MAX_SIZE_SEM_BUFFER as i32,
)
}
.to_result()?;
let response = postcard::from_bytes::<SelectResponse>(&response_buffer)
.map_err(|_e| ApiError::Serde("deserializing select response"))?;
Ok(response)
}