use alloc::boxed::Box;
use core::ops::Range;
use wasefire_applet_api::store::fragment as api;
use crate::{Error, convert_bool, convert_unit};
pub fn insert(keys: Range<usize>, value: &[u8]) -> Result<(), Error> {
let params =
api::insert::Params { keys: encode_keys(keys)?, ptr: value.as_ptr(), len: value.len() };
convert_unit(unsafe { api::insert(params) })
}
pub fn remove(keys: Range<usize>) -> Result<(), Error> {
let params = api::remove::Params { keys: encode_keys(keys)? };
convert_unit(unsafe { api::remove(params) })
}
pub fn find(keys: Range<usize>) -> Result<Option<Box<[u8]>>, Error> {
let mut ptr = core::ptr::null_mut();
let mut len = 0;
let params = api::find::Params { keys: encode_keys(keys)?, 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)
}
}
fn encode_keys(keys: Range<usize>) -> Result<u32, Error> {
let start = u16::try_from(keys.start).map_err(|_| Error::user(0))? as u32;
let end = u16::try_from(keys.end).map_err(|_| Error::user(0))? as u32;
Ok((end << 16) | start)
}