use bincode::{
config::{
BigEndian, Bounded, RejectTrailing, VarintEncoding, WithOtherEndian, WithOtherIntEncoding,
WithOtherLimit, WithOtherTrailing,
},
DefaultOptions, Options,
};
use serde::de::DeserializeOwned;
use tracing::{error, warn};
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
pub struct KVDBFatal;
pub type KVDBResult<T> = Result<T, KVDBFatal>;
pub type BytesVec = Vec<u8>;
const MAX_MSG_LEN: u64 = 1000 * 1000;
pub fn serialize<T>(value: &T) -> KVDBResult<BytesVec>
where
T: serde::Serialize + ?Sized,
{
let bincode = bincoder();
bincode.serialize(value).map_err(|err| {
error!("serialization failure: {}", err.to_string());
KVDBFatal
})
}
pub fn deserialize<T: DeserializeOwned>(bytes: &[u8]) -> Option<T> {
let bincode = bincoder();
bincode
.deserialize(bytes)
.map_err(|err| {
warn!("deserialization failure: {}", err.to_string());
})
.ok()
}
#[allow(clippy::type_complexity)]
fn bincoder() -> WithOtherTrailing<
WithOtherIntEncoding<
WithOtherEndian<WithOtherLimit<DefaultOptions, Bounded>, BigEndian>,
VarintEncoding,
>,
RejectTrailing,
> {
DefaultOptions::new()
.with_limit(MAX_MSG_LEN)
.with_big_endian() .with_varint_encoding() .reject_trailing_bytes() }