pub trait StableHeap {
fn heap_to_bytes(&self) -> Vec<u8>;
fn heap_from_bytes(&mut self, bytes: &[u8]);
}
#[inline]
fn type_key<T: ?Sized + 'static>() -> String {
use std::any::TypeId;
format!("{:?}", TypeId::of::<T>())
}
pub fn to_bytes<T: 'static + serde::Serialize>(value: &T) -> Result<Vec<u8>, String> {
let mut bytes = vec![];
ciborium::ser::into_writer(value, &mut bytes).map_err(|e| {
format!(
"{}: {}",
match e {
ciborium::ser::Error::Io(_) => "write bytes failed.",
ciborium::ser::Error::Value(_) => "serialize failed.",
},
type_key::<T>()
)
})?;
Ok(bytes)
}
pub fn from_bytes<T: 'static + serde::de::DeserializeOwned>(bytes: &[u8]) -> Result<T, String> {
ciborium::de::from_reader(bytes).map_err(|_| format!("deserialize failed: {}", type_key::<T>()))
}