Diffstat (limited to 'src/build/builders/serde/deserialize.rs')
| -rw-r--r-- | src/build/builders/serde/deserialize.rs | 47 |
1 files changed, 29 insertions, 18 deletions
diff --git a/src/build/builders/serde/deserialize.rs b/src/build/builders/serde/deserialize.rs index 1c24e6e..664647d 100644 --- a/src/build/builders/serde/deserialize.rs +++ b/src/build/builders/serde/deserialize.rs @@ -1,6 +1,6 @@ //! Adapter for serde's Deserialize trait. -use core::ops::ControlFlow; +use core::{marker::PhantomData, ops::ControlFlow}; use serde::{de::SeqAccess, forward_to_deserialize_any, Deserialize, Deserializer}; @@ -9,9 +9,9 @@ use crate::{ any_trait, protocol::{ visitor::{Sequence, SequenceScope, Status, Value}, - ControlFlowFor, + AnyTraitObj, AnyTraitSendObj, AsyncEffect, ControlFlowFor, Effect, SyncEffect, }, - Builder as _, + AsVisitor, Builder as _, }; #[derive(Debug)] @@ -23,17 +23,16 @@ pub enum Error { #[cfg(feature = "std")] impl std::error::Error for Error {} -pub struct Builder<T>(Result<T, Error>); +pub struct Builder<T, E>(Result<T, Error>, PhantomData<fn() -> E>); -impl<'ctx, T: Deserialize<'ctx>> crate::Builder<'ctx> for Builder<T> { +impl<'ctx, T: Deserialize<'ctx>, E: for<'a> Effect<'a, 'ctx>> crate::Builder<'ctx, E> for Builder<T, E> +where + Self: AsVisitor<'ctx, E>, +{ type Error = Error; type Value = T; - fn as_visitor(&mut self) -> &mut crate::protocol::Visitor<'_, 'ctx> { - self - } - fn build(self) -> Result<Self::Value, Self::Error> { self.0 } @@ -41,12 +40,24 @@ impl<'ctx, T: Deserialize<'ctx>> crate::Builder<'ctx> for Builder<T> { type Seed = (); fn from_seed(seed: Self::Seed) -> Self { - Self(Err(Error::Incomplete)) + Self(Err(Error::Incomplete), PhantomData) + } +} + +impl<'ctx, T: Deserialize<'ctx>> AsVisitor<'ctx, SyncEffect> for Builder<T, SyncEffect> { + fn as_visitor(&mut self) -> crate::protocol::Visitor<'_, 'ctx, SyncEffect> { + AnyTraitObj::from_obj(self) + } +} + +impl<'ctx, T: Deserialize<'ctx> + Send> AsVisitor<'ctx, AsyncEffect> for Builder<T, AsyncEffect> { + fn as_visitor(&mut self) -> crate::protocol::Visitor<'_, 'ctx, AsyncEffect> { + AnyTraitSendObj::from_obj_send(self) } } any_trait! { - impl['a, 'ctx, T: Deserialize<'ctx>] Builder<T> = [ + impl['a, 'ctx, T: Deserialize<'ctx>, E] Builder<T, E> = [ dyn Value<'a, OwnedStatic<bool>> + 'a, dyn Sequence<'ctx> + 'a, ] @@ -54,12 +65,12 @@ any_trait! { enum InjectedValue<'a, 'ctx> { Bool(bool), - Sequence(&'a mut dyn SequenceScope<'ctx>), + Sequence(&'a mut dyn for<'b> SequenceScope<'b, 'ctx>), } -impl<'a, 'ctx, T: Deserialize<'ctx>> Value<'a, OwnedStatic<bool>> for Builder<T> { +impl<'a, 'ctx, T: Deserialize<'ctx>, E> Value<'a, 'ctx, OwnedStatic<bool>> for Builder<T, E> { #[inline] - fn visit(&'a mut self, OwnedStatic(value): OwnedStatic<bool>) -> ControlFlowFor<'a> { + fn visit(&'a mut self, OwnedStatic(value): OwnedStatic<bool>) -> ControlFlowFor<'a, 'ctx> { self.0 = T::deserialize(InjectedValue::Bool(value)); if self.0.is_err() { @@ -70,9 +81,9 @@ impl<'a, 'ctx, T: Deserialize<'ctx>> Value<'a, OwnedStatic<bool>> for Builder<T> } } -impl<'ctx, T: Deserialize<'ctx>> Sequence<'ctx> for Builder<T> { +impl<'a, 'ctx, T: Deserialize<'ctx>, E> Sequence<'a, 'ctx> for Builder<T, E> { #[inline] - fn visit<'a>(&'a mut self, scope: &'a mut dyn SequenceScope<'ctx>) -> ControlFlowFor<'a> { + fn visit(&'a mut self, scope: &'a mut dyn for<'b> SequenceScope<'b, 'ctx>) -> ControlFlowFor<'a, 'ctx> { self.0 = T::deserialize(InjectedValue::Sequence(scope)); if self.0.is_err() { @@ -119,7 +130,7 @@ impl<'a, 'ctx> Deserializer<'ctx> for InjectedValue<'a, 'ctx> { } } -struct SequenceAccess<'a, 'ctx>(&'a mut dyn SequenceScope<'ctx>); +struct SequenceAccess<'a, 'ctx>(&'a mut dyn for<'b> SequenceScope<'b, 'ctx>); impl<'a, 'ctx> SeqAccess<'ctx> for SequenceAccess<'a, 'ctx> { type Error = Error; @@ -128,7 +139,7 @@ impl<'a, 'ctx> SeqAccess<'ctx> for SequenceAccess<'a, 'ctx> { where T: serde::de::DeserializeSeed<'ctx>, { - let mut builder = super::deserialize_seed::Builder::from_seed(seed); + let mut builder = super::deserialize_seed::Builder::<_, SyncEffect>::from_seed(seed); match self.0.next(builder.as_visitor()) { ControlFlow::Continue(Status::Continue) => match builder.build() { Ok(value) => Ok(Some(value)), |