#[cfg(feature = "storage")]
use serde::{de::DeserializeOwned, Serialize};
#[cfg(feature = "storage")]
use postcard::from_bytes as from_postcard_slice;
#[cfg(feature = "storage")]
use postcard::to_slice as to_postcard_slice;
#[cfg(feature = "storage")]
use wasm4fun_core::{diskr, diskw};
use wasm4fun_log::debug;
#[cfg(feature = "storage")]
pub fn store<T, const BUFFER_LENGTH: usize>(payload: T)
where
T: Serialize,
{
let mut buffer: [u8; BUFFER_LENGTH] = [0; BUFFER_LENGTH];
let slice: &[u8] = match to_postcard_slice(&payload, &mut buffer) {
Ok(slice) => slice,
Err(message) => {
debug!("Could not serialize payload");
debug!("Reason: {}", message);
panic!("Could not serialize payload");
}
};
debug!("Payload serialized to {} bytes", slice.len());
let bytes_written = unsafe { diskw(slice.as_ptr(), slice.len() as u32) };
if bytes_written != slice.len() as u32 {
debug!("Could not write payload");
debug!("Written {} bytes instead of {}", bytes_written, slice.len());
}
}
#[cfg(feature = "storage")]
pub fn load<T, const BUFFER_LENGTH: usize>() -> T
where
T: Default + DeserializeOwned,
{
let mut buffer: [u8; BUFFER_LENGTH] = [0; BUFFER_LENGTH];
let bytes_read = unsafe { diskr(buffer.as_mut_ptr(), buffer.len() as u32) };
let data: &[u8] = &buffer[0..bytes_read as usize];
let payload: T = match from_postcard_slice(data) {
Ok(payload) => payload,
Err(message) => {
debug!("Could not deserialize payload");
debug!("Reason: {}", message);
Default::default()
}
};
debug!("Loaded payload");
payload
}
#[cfg(not(feature = "storage"))]
pub fn store<T, const BUFFER_LENGTH: usize>(_payload: T) {
debug!("Storage not enabled");
}
#[cfg(not(feature = "storage"))]
pub fn load<T, const BUFFER_LENGTH: usize>() -> T
where
T: Default,
{
debug!("Storage not enabled");
Default::default()
}