add remaining _seed variants of deserialize functions

This commit is contained in:
alecmocatta 2019-08-04 23:48:17 +01:00 committed by Josh Matthews
parent 30ada4acda
commit ecbef8d1bb
3 changed files with 60 additions and 12 deletions

View File

@ -290,6 +290,18 @@ impl Config {
config_map!(self, opts => ::internal::deserialize_from(reader, opts)) config_map!(self, opts => ::internal::deserialize_from(reader, opts))
} }
/// Deserializes an object directly from a `Read`er with state `seed` using this configuration
///
/// If this returns an `Error`, `reader` may be in an invalid state.
#[inline(always)]
pub fn deserialize_from_seed<'a, R: Read, T: serde::de::DeserializeSeed<'a>>(
&self,
seed: T,
reader: R,
) -> Result<T::Value> {
config_map!(self, opts => ::internal::deserialize_from_seed(seed, reader, opts))
}
/// Deserializes an object from a custom `BincodeRead`er using the default configuration. /// Deserializes an object from a custom `BincodeRead`er using the default configuration.
/// It is highly recommended to use `deserialize_from` unless you need to implement /// It is highly recommended to use `deserialize_from` unless you need to implement
/// `BincodeRead` for performance reasons. /// `BincodeRead` for performance reasons.
@ -303,6 +315,24 @@ impl Config {
config_map!(self, opts => ::internal::deserialize_from_custom(reader, opts)) config_map!(self, opts => ::internal::deserialize_from_custom(reader, opts))
} }
/// Deserializes an object from a custom `BincodeRead`er with state `seed` using the default
/// configuration. It is highly recommended to use `deserialize_from` unless you need to
/// implement `BincodeRead` for performance reasons.
///
/// If this returns an `Error`, `reader` may be in an invalid state.
#[inline(always)]
pub fn deserialize_from_custom_seed<
'a,
R: BincodeRead<'a>,
T: serde::de::DeserializeSeed<'a>,
>(
&self,
seed: T,
reader: R,
) -> Result<T::Value> {
config_map!(self, opts => ::internal::deserialize_from_custom_seed(seed, reader, opts))
}
/// Executes the acceptor with a serde::Deserializer instance. /// Executes the acceptor with a serde::Deserializer instance.
/// NOT A PART OF THE STABLE PUBLIC API /// NOT A PART OF THE STABLE PUBLIC API
#[doc(hidden)] #[doc(hidden)]

View File

@ -150,13 +150,13 @@ where
} }
} }
impl<R> BincodeRead<'static> for IoReader<R> impl<'a, R> BincodeRead<'a> for IoReader<R>
where where
R: io::Read, R: io::Read,
{ {
fn forward_read_str<V>(&mut self, length: usize, visitor: V) -> Result<V::Value> fn forward_read_str<V>(&mut self, length: usize, visitor: V) -> Result<V::Value>
where where
V: serde::de::Visitor<'static>, V: serde::de::Visitor<'a>,
{ {
self.fill_buffer(length)?; self.fill_buffer(length)?;
@ -176,7 +176,7 @@ where
fn forward_read_bytes<V>(&mut self, length: usize, visitor: V) -> Result<V::Value> fn forward_read_bytes<V>(&mut self, length: usize, visitor: V) -> Result<V::Value>
where where
V: serde::de::Visitor<'static>, V: serde::de::Visitor<'a>,
{ {
self.fill_buffer(length)?; self.fill_buffer(length)?;
let r = visitor.visit_bytes(&self.temp_buffer[..]); let r = visitor.visit_bytes(&self.temp_buffer[..]);

View File

@ -1,5 +1,6 @@
use serde; use serde;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::marker::PhantomData;
use config::{Options, OptionsExt}; use config::{Options, OptionsExt};
use de::read::BincodeRead; use de::read::BincodeRead;
@ -77,10 +78,18 @@ where
R: Read, R: Read,
T: serde::de::DeserializeOwned, T: serde::de::DeserializeOwned,
O: Options, O: Options,
{
deserialize_from_seed(PhantomData, reader, options)
}
pub(crate) fn deserialize_from_seed<'a, R, T, O>(seed: T, reader: R, options: O) -> Result<T::Value>
where
R: Read,
T: serde::de::DeserializeSeed<'a>,
O: Options,
{ {
let reader = ::de::read::IoReader::new(reader); let reader = ::de::read::IoReader::new(reader);
let mut deserializer = ::de::Deserializer::<_, O>::new(reader, options); deserialize_from_custom_seed(seed, reader, options)
serde::Deserialize::deserialize(&mut deserializer)
} }
pub(crate) fn deserialize_from_custom<'a, R, T, O>(reader: R, options: O) -> Result<T> pub(crate) fn deserialize_from_custom<'a, R, T, O>(reader: R, options: O) -> Result<T>
@ -88,9 +97,22 @@ where
R: BincodeRead<'a>, R: BincodeRead<'a>,
T: serde::de::DeserializeOwned, T: serde::de::DeserializeOwned,
O: Options, O: Options,
{
deserialize_from_custom_seed(PhantomData, reader, options)
}
pub(crate) fn deserialize_from_custom_seed<'a, R, T, O>(
seed: T,
reader: R,
options: O,
) -> Result<T::Value>
where
R: BincodeRead<'a>,
T: serde::de::DeserializeSeed<'a>,
O: Options,
{ {
let mut deserializer = ::de::Deserializer::<_, O>::new(reader, options); let mut deserializer = ::de::Deserializer::<_, O>::new(reader, options);
serde::Deserialize::deserialize(&mut deserializer) seed.deserialize(&mut deserializer)
} }
pub(crate) fn deserialize_in_place<'a, R, T, O>(reader: R, options: O, place: &mut T) -> Result<()> pub(crate) fn deserialize_in_place<'a, R, T, O>(reader: R, options: O, place: &mut T) -> Result<()>
@ -108,10 +130,7 @@ where
T: serde::de::Deserialize<'a>, T: serde::de::Deserialize<'a>,
O: Options, O: Options,
{ {
let reader = ::de::read::SliceReader::new(bytes); deserialize_seed(PhantomData, bytes, options)
let options = ::config::WithOtherLimit::new(options, Infinite);
let mut deserializer = ::de::Deserializer::new(reader, options);
serde::Deserialize::deserialize(&mut deserializer)
} }
pub(crate) fn deserialize_seed<'a, T, O>(seed: T, bytes: &'a [u8], options: O) -> Result<T::Value> pub(crate) fn deserialize_seed<'a, T, O>(seed: T, bytes: &'a [u8], options: O) -> Result<T::Value>
@ -121,8 +140,7 @@ where
{ {
let reader = ::de::read::SliceReader::new(bytes); let reader = ::de::read::SliceReader::new(bytes);
let options = ::config::WithOtherLimit::new(options, Infinite); let options = ::config::WithOtherLimit::new(options, Infinite);
let mut deserializer = ::de::Deserializer::new(reader, options); deserialize_from_custom_seed(seed, reader, options)
seed.deserialize(&mut deserializer)
} }
pub(crate) trait SizeLimit: Clone { pub(crate) trait SizeLimit: Clone {