use crate::de::null_collections_behavior::NullCollectionsBehavior;
use crate::de::unknown_fields_behavior::UnknownFieldsBehavior;
use crate::json::de::client::ValueBehavior;
use serde::de;
use serde_json::de::{IoRead, Read, SliceRead, StrRead};
use serde_json::Error;
use std::io;
pub fn server_from_reader<R, T>(reader: R) -> Result<T, Error>
where
R: io::Read,
T: de::DeserializeOwned,
{
let mut de = ServerDeserializer::from_reader(reader);
let value = T::deserialize(&mut de)?;
de.end()?;
Ok(value)
}
pub fn server_from_str<'a, T>(s: &'a str) -> Result<T, Error>
where
T: de::Deserialize<'a>,
{
let mut de = ServerDeserializer::from_str(s);
let value = T::deserialize(&mut de)?;
de.end()?;
Ok(value)
}
pub fn server_from_slice<'a, T>(s: &'a [u8]) -> Result<T, Error>
where
T: de::Deserialize<'a>,
{
let mut de = ServerDeserializer::from_slice(s);
let value = T::deserialize(&mut de)?;
de.end()?;
Ok(value)
}
pub struct ServerDeserializer<R>(serde_json::Deserializer<R>);
impl<R> ServerDeserializer<IoRead<R>>
where
R: io::Read,
{
pub fn from_reader(reader: R) -> ServerDeserializer<IoRead<R>> {
ServerDeserializer(serde_json::Deserializer::from_reader(reader))
}
}
impl<'a> ServerDeserializer<SliceRead<'a>> {
pub fn from_slice(bytes: &'a [u8]) -> ServerDeserializer<SliceRead<'a>> {
ServerDeserializer(serde_json::Deserializer::from_slice(bytes))
}
}
impl<'a> ServerDeserializer<StrRead<'a>> {
#[allow(clippy::should_implement_trait)] pub fn from_str(s: &'a str) -> ServerDeserializer<StrRead<'a>> {
ServerDeserializer(serde_json::Deserializer::from_str(s))
}
}
impl<'de, R> ServerDeserializer<R>
where
R: Read<'de>,
{
pub fn end(&mut self) -> Result<(), Error> {
self.0.end()
}
}
impl<'a, 'de, R> de::Deserializer<'de> for &'a mut ServerDeserializer<R>
where
R: Read<'de>,
{
impl_deserialize_body!(
&'a mut serde_json::Deserializer<R>,
UnknownFieldsBehavior<NullCollectionsBehavior<ValueBehavior>>
);
fn is_human_readable(&self) -> bool {
true
}
}