#[cfg(feature = "api-store")]
use alloc::boxed::Box;
#[cfg(feature = "api-store")]
use alloc::vec::Vec;
#[cfg(feature = "api-store")]
use wasefire_applet_api::store as api;
#[cfg(feature = "api-store")]
use crate::{Error, convert, convert_bool, convert_unit};
#[cfg(feature = "api-store-fragment")]
pub mod fragment;
#[cfg(feature = "api-store")]
pub fn insert(key: usize, value: &[u8]) -> Result<(), Error> {
let params = api::insert::Params { key, ptr: value.as_ptr(), len: value.len() };
convert_unit(unsafe { api::insert(params) })
}
#[cfg(feature = "api-store")]
pub fn remove(key: usize) -> Result<(), Error> {
let params = api::remove::Params { key };
convert_unit(unsafe { api::remove(params) })
}
#[cfg(feature = "api-store")]
pub fn find(key: usize) -> Result<Option<Box<[u8]>>, Error> {
let mut ptr = core::ptr::null_mut();
let mut len = 0;
let params = api::find::Params { key, ptr: &mut ptr, len: &mut len };
if convert_bool(unsafe { api::find(params) })? {
let ptr = core::ptr::slice_from_raw_parts_mut(ptr, len);
Ok(Some(if len == 0 { Box::new([]) } else { unsafe { Box::from_raw(ptr) } }))
} else {
Ok(None)
}
}
#[cfg(feature = "api-store")]
pub fn keys() -> Result<Vec<u16>, Error> {
let mut ptr = core::ptr::null_mut();
let params = api::keys::Params { ptr: &mut ptr };
let len = convert(unsafe { api::keys(params) })?;
let ptr = ptr as *mut u16;
Ok(if len == 0 { Vec::new() } else { unsafe { Vec::from_raw_parts(ptr, len, len) } })
}
#[cfg(feature = "api-store")]
pub fn clear() -> Result<(), Error> {
convert_unit(unsafe { api::clear() })
}