use serde::Serialize;
use serde::de::DeserializeOwned;
use serde_cbor::from_slice;
use serde_cbor::to_vec;
use std::panic::{AssertUnwindSafe, catch_unwind};
pub(in crate::db) fn encode_cbor_bytes<T>(value: &T) -> Result<Vec<u8>, String>
where
T: Serialize,
{
to_vec(value).map_err(|err| err.to_string())
}
pub(in crate::db) fn decode_cbor_bytes<T>(bytes: &[u8]) -> Result<T, String>
where
T: DeserializeOwned,
{
let result = catch_unwind(AssertUnwindSafe(|| from_slice(bytes)));
match result {
Ok(Ok(value)) => Ok(value),
Ok(Err(err)) => Err(err.to_string()),
Err(_) => Err("panic during CBOR deserialization".into()),
}
}