use serde::Deserializer;
use crate::serde_support::{ReIntegrationBytesVisitor, ReIntegrator, RiScope};
use crate::{AnyRc, ArcBin, Bin, RcBin, SBin};
pub fn ri_deserialize_bin<'de, D>(deserialize: D) -> Result<Bin, D::Error>
where
D: Deserializer<'de>,
{
deserialize.deserialize_bytes(ReIntegrationBytesVisitor::<BinReIntegrator>::new())
}
pub fn ri_deserialize_sbin<'de, D>(deserialize: D) -> Result<SBin, D::Error>
where
D: Deserializer<'de>,
{
deserialize.deserialize_bytes(ReIntegrationBytesVisitor::<SyncBinReIntegrator>::new())
}
struct BinReIntegrator {}
impl ReIntegrator for BinReIntegrator {
type TBin = Bin;
#[inline]
fn re_integrate(slice: &[u8]) -> Self::TBin {
if let Some(bin) = RiScope::try_re_integrate(slice) {
bin
} else {
RcBin::copy_from_slice(slice)
}
}
#[inline]
fn vec(vec: Vec<u8>) -> Self::TBin {
RcBin::from_vec(vec)
}
#[inline]
fn overhead_bytes_for_vec() -> usize {
RcBin::overhead_bytes()
}
}
struct SyncBinReIntegrator {}
impl ReIntegrator for SyncBinReIntegrator {
type TBin = SBin;
#[inline]
fn re_integrate(slice: &[u8]) -> Self::TBin {
if let Some(bin) = RiScope::try_re_integrate_sync(slice) {
bin
} else {
ArcBin::copy_from_slice(slice)
}
}
#[inline]
fn vec(vec: Vec<u8>) -> Self::TBin {
ArcBin::from_vec(vec)
}
#[inline]
fn overhead_bytes_for_vec() -> usize {
ArcBin::overhead_bytes()
}
}