use crate::ComponentImports;
#[derive(Debug)]
pub enum LocalStorageGetItemError {
KeyTooLong,
KeyNotUtf8,
OutBufferBelowMinimumSize,
#[allow(missing_docs)]
OutBufferSmallerThanValue { value_len: usize },
#[allow(missing_docs)]
Unrecognized { error_code: i32 },
}
impl ComponentImports {
pub fn local_storage_get_item<'out>(
&self,
key: &str,
out_buffer: &'out mut [u8],
) -> Result<Option<&'out str>, LocalStorageGetItemError> {
let returned = unsafe {
afia_component_sys::local_storage_get_item(
self.component_imports_ptr,
key.as_ptr(),
key.len(),
out_buffer.as_mut_ptr(),
out_buffer.len(),
)
};
match returned {
length if length >= 0 => {
let length = length as usize;
let string = unsafe { std::str::from_utf8_unchecked(&out_buffer[0..length]) };
Ok(Some(string))
}
-1 => Err(LocalStorageGetItemError::KeyTooLong),
-2 => Err(LocalStorageGetItemError::KeyNotUtf8),
-3 => Ok(None),
-4 => Err(LocalStorageGetItemError::OutBufferBelowMinimumSize),
-5 => {
let mut val_len = [0; 4];
val_len.copy_from_slice(&out_buffer[0..4]);
let val = i32::from_le_bytes(val_len);
Err(LocalStorageGetItemError::OutBufferSmallerThanValue {
value_len: val as usize,
})
}
unknown_error_code => Err(LocalStorageGetItemError::Unrecognized {
error_code: unknown_error_code,
}),
}
}
pub fn local_storage_set_item(&self, key: &str, val: &str) {
unsafe {
afia_component_sys::local_storage_set_item(
self.component_imports_ptr,
key.as_ptr(),
key.len(),
val.as_ptr(),
val.len(),
)
}
}
}