use crate::de::null_collections_behavior::NullCollectionsBehavior;
use crate::de::Behavior;
use crate::json::de::client::KeyBehavior;
use serde::de;
use serde_smile::de::{IoRead, MutSliceRead, Read, SliceRead};
use serde_smile::Error;
use std::io::BufRead;
pub fn client_from_reader<R, T>(reader: R) -> Result<T, Error>
where
R: BufRead,
T: de::DeserializeOwned,
{
let mut de = ClientDeserializer::from_reader(reader);
let value = T::deserialize(&mut de)?;
de.end()?;
Ok(value)
}
pub fn client_from_slice<'a, T>(s: &'a [u8]) -> Result<T, Error>
where
T: de::Deserialize<'a>,
{
let mut de = ClientDeserializer::from_slice(s);
let value = T::deserialize(&mut de)?;
de.end()?;
Ok(value)
}
pub fn client_from_mut_slice<'a, T>(s: &'a mut [u8]) -> Result<T, Error>
where
T: de::Deserialize<'a>,
{
let mut de = ClientDeserializer::from_mut_slice(s);
let value = T::deserialize(&mut de)?;
de.end()?;
Ok(value)
}
pub struct ClientDeserializer<'de, R>(serde_smile::Deserializer<'de, R>);
impl<R> ClientDeserializer<'_, IoRead<R>>
where
R: BufRead,
{
pub fn from_reader(reader: R) -> Self {
ClientDeserializer(serde_smile::Deserializer::from_reader(reader))
}
}
impl<'a> ClientDeserializer<'a, SliceRead<'a>> {
pub fn from_slice(bytes: &'a [u8]) -> Self {
ClientDeserializer(serde_smile::Deserializer::from_slice(bytes))
}
}
impl<'a> ClientDeserializer<'a, MutSliceRead<'a>> {
pub fn from_mut_slice(bytes: &'a mut [u8]) -> Self {
ClientDeserializer(serde_smile::Deserializer::from_mut_slice(bytes))
}
}
impl<'de, R> ClientDeserializer<'de, R>
where
R: Read<'de>,
{
pub fn get_ref(&self) -> &R {
self.0.get_ref()
}
pub fn get_mut(&mut self) -> &mut R {
self.0.get_mut()
}
pub fn into_inner(self) -> R {
self.0.into_inner()
}
pub fn end(&mut self) -> Result<(), Error> {
self.0.end()
}
}
impl<'a, 'de, R> de::Deserializer<'de> for &'a mut ClientDeserializer<'de, R>
where
R: Read<'de>,
{
impl_deserialize_body!(
&'a mut serde_smile::Deserializer<'de, R>,
NullCollectionsBehavior<ValueBehavior>
);
fn is_human_readable(&self) -> bool {
false
}
}
pub enum ValueBehavior {}
impl Behavior for ValueBehavior {
type KeyBehavior = KeyBehavior;
}