use serde::{Serialize, de::DeserializeOwned};
use std::io::Read;
#[cfg(feature = "__serde_bincode")]
const BYTE_LIMIT: usize = 1024 * 1024 * 1024;
#[cfg(any(serde_default, feature = "__serde_postcard"))]
const SLIDING_BUFFER_SIZE: usize = 2048;
#[allow(clippy::vec_init_then_push)]
#[must_use]
pub fn as_feature() -> &'static str {
let mut formats = vec![];
#[cfg(feature = "__serde_bincode")]
formats.push("serde_bincode");
#[cfg(any(serde_default, feature = "__serde_postcard"))]
formats.push("serde_postcard");
assert!(
formats.len() <= 1,
"Multiple serde formats selected: {formats:?}"
);
formats.pop().expect("No serde format selected")
}
pub fn serialize<T: Serialize>(args: &T) -> Vec<u8> {
#[cfg(feature = "__serde_bincode")]
return {
let config = bincode::config::standard().with_limit::<BYTE_LIMIT>();
bincode::serde::encode_to_vec(args, config).unwrap()
};
#[cfg(any(serde_default, feature = "__serde_postcard"))]
return {
let mut data = Vec::new();
postcard::to_io(args, &mut data).unwrap();
data
};
}
#[allow(unused_mut)]
pub fn deserialize<T: DeserializeOwned, R: Read>(mut reader: R) -> Option<T> {
#[cfg(feature = "__serde_bincode")]
return {
let config = bincode::config::standard().with_limit::<BYTE_LIMIT>();
bincode::serde::decode_from_std_read(&mut reader, config).ok()
};
#[cfg(any(serde_default, feature = "__serde_postcard"))]
return {
let mut buff = [0; SLIDING_BUFFER_SIZE];
postcard::from_io((reader, &mut buff))
.map(|(value, _)| value)
.ok()
};
}