#[cfg(feature = "serde")]
use crate::{
Error,
binary::{TokenResolver, de::BinaryDeserializerBuilder},
};
pub trait BinaryFlavor: crate::Encoding {
fn visit_f32(&self, data: [u8; 4]) -> f32;
fn visit_f64(&self, data: [u8; 8]) -> f64;
#[cfg(feature = "serde")]
fn deserializer(&self) -> BinaryDeserializerBuilder<&Self>
where
Self: Sized,
{
BinaryDeserializerBuilder::with_flavor(self)
}
#[cfg(feature = "serde")]
fn deserialize_slice<'de, 'res: 'de, T, RES>(
&self,
data: &'de [u8],
resolver: &'res RES,
) -> Result<T, Error>
where
T: serde::de::Deserialize<'de>,
RES: TokenResolver,
Self: Sized,
{
self.deserializer().deserialize_slice(data, resolver)
}
#[cfg(feature = "serde")]
fn deserialize_reader<T, RES, R>(&self, reader: R, resolver: &RES) -> Result<T, Error>
where
T: serde::de::DeserializeOwned,
RES: TokenResolver,
R: std::io::Read,
Self: Sized,
{
self.deserializer().deserialize_reader(reader, resolver)
}
}
impl<T: BinaryFlavor + ?Sized> BinaryFlavor for &'_ T {
fn visit_f32(&self, data: [u8; 4]) -> f32 {
(**self).visit_f32(data)
}
fn visit_f64(&self, data: [u8; 8]) -> f64 {
(**self).visit_f64(data)
}
}
impl<T: BinaryFlavor + ?Sized> BinaryFlavor for Box<T> {
fn visit_f32(&self, data: [u8; 4]) -> f32 {
(**self).visit_f32(data)
}
fn visit_f64(&self, data: [u8; 8]) -> f64 {
(**self).visit_f64(data)
}
}