Diffstat (limited to 'src/build/builders/serde/deserialize_seed.rs')
| -rw-r--r-- | src/build/builders/serde/deserialize_seed.rs | 52 |
1 files changed, 35 insertions, 17 deletions
diff --git a/src/build/builders/serde/deserialize_seed.rs b/src/build/builders/serde/deserialize_seed.rs index 614cbda..866206c 100644 --- a/src/build/builders/serde/deserialize_seed.rs +++ b/src/build/builders/serde/deserialize_seed.rs @@ -12,9 +12,9 @@ use crate::{ any_trait, protocol::{ visitor::{Sequence, SequenceScope, Status, Value}, - ControlFlowFor, + AnyTraitObj, AnyTraitSendObj, AsyncEffect, ControlFlowFor, Effect, SyncEffect, }, - Builder as _, + AsVisitor, Builder as _, }; pub enum Error<T> { @@ -36,17 +36,19 @@ impl<T> core::fmt::Debug for Error<T> { } } -pub struct Builder<'ctx, T: DeserializeSeed<'ctx>>(Result<T::Value, Error<T>>); +pub struct Builder<'ctx, T: DeserializeSeed<'ctx>, E>( + Result<T::Value, Error<T>>, + PhantomData<fn() -> E>, +); -impl<'ctx, T: DeserializeSeed<'ctx>> crate::Builder<'ctx> for Builder<'ctx, T> { +impl<'ctx, T: DeserializeSeed<'ctx>, E: for<'a> Effect<'a, 'ctx>> crate::Builder<'ctx, E> for Builder<'ctx, T, E> +where + Self: AsVisitor<'ctx, E>, +{ type Error = Error<T>; type Value = T::Value; - fn as_visitor(&mut self) -> &mut crate::protocol::Visitor<'_, 'ctx> { - self - } - fn build(self) -> Result<Self::Value, Self::Error> { self.0 } @@ -54,12 +56,28 @@ impl<'ctx, T: DeserializeSeed<'ctx>> crate::Builder<'ctx> for Builder<'ctx, T> { type Seed = T; fn from_seed(seed: Self::Seed) -> Self { - Self(Err(Error::Pending(seed))) + Self(Err(Error::Pending(seed)), PhantomData) + } +} + +impl<'ctx, T: DeserializeSeed<'ctx>> AsVisitor<'ctx, SyncEffect> for Builder<'ctx, T, SyncEffect> { + fn as_visitor(&mut self) -> crate::protocol::Visitor<'_, 'ctx, SyncEffect> { + AnyTraitObj::from_obj(self) + } +} + +impl<'ctx, T: DeserializeSeed<'ctx> + Send> AsVisitor<'ctx, AsyncEffect> + for Builder<'ctx, T, AsyncEffect> +where + T::Value: Send, +{ + fn as_visitor(&mut self) -> crate::protocol::Visitor<'_, 'ctx, AsyncEffect> { + AnyTraitSendObj::from_obj_send(self) } } any_trait! { - impl['a, 'ctx, T: DeserializeSeed<'ctx>] Builder<'ctx, T> = [ + impl['a, 'ctx, T: DeserializeSeed<'ctx>, E] Builder<'ctx, T, E> = [ dyn Value<'a, OwnedStatic<bool>> + 'a, dyn Sequence<'ctx> + 'a, ] @@ -67,13 +85,13 @@ any_trait! { enum InjectedValue<'a, 'ctx, T> { Bool(bool), - Sequence(&'a mut dyn SequenceScope<'ctx>), + Sequence(&'a mut dyn for<'b> SequenceScope<'b, 'ctx>), Extra(PhantomData<T>), } -impl<'a, 'ctx, T: DeserializeSeed<'ctx>> Value<'a, OwnedStatic<bool>> for Builder<'ctx, T> { +impl<'a, 'ctx, T: DeserializeSeed<'ctx>, E> Value<'a, 'ctx, OwnedStatic<bool>> for Builder<'ctx, T, E> { #[inline] - fn visit(&'a mut self, OwnedStatic(bool_value): OwnedStatic<bool>) -> ControlFlowFor<'a> { + fn visit(&'a mut self, OwnedStatic(bool_value): OwnedStatic<bool>) -> ControlFlowFor<'a, 'ctx> { let pending = core::mem::replace(&mut self.0, Err(Error::Incomplete)); let Err(Error::Pending(value)) = pending else { todo!() @@ -89,9 +107,9 @@ impl<'a, 'ctx, T: DeserializeSeed<'ctx>> Value<'a, OwnedStatic<bool>> for Builde } } -impl<'ctx, T: DeserializeSeed<'ctx>> Sequence<'ctx> for Builder<'ctx, T> { +impl<'a, 'ctx, T: DeserializeSeed<'ctx>, E> Sequence<'a, 'ctx> for Builder<'ctx, 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> { let pending = core::mem::replace(&mut self.0, Err(Error::Incomplete)); let Err(Error::Pending(value)) = pending else { todo!() @@ -144,7 +162,7 @@ impl<'a, 'ctx, T> Deserializer<'ctx> for InjectedValue<'a, 'ctx, T> { } } -struct SequenceAccess<'a, 'ctx, T>(&'a mut dyn SequenceScope<'ctx>, PhantomData<T>); +struct SequenceAccess<'a, 'ctx, T>(&'a mut dyn for<'b> SequenceScope<'b, 'ctx>, PhantomData<T>); impl<'a, 'ctx, T> SeqAccess<'ctx> for SequenceAccess<'a, 'ctx, T> { type Error = Error<T>; @@ -153,7 +171,7 @@ impl<'a, 'ctx, T> SeqAccess<'ctx> for SequenceAccess<'a, 'ctx, T> { where U: serde::de::DeserializeSeed<'ctx>, { - let mut builder = Builder::from_seed(seed); + let mut builder = Builder::<_, SyncEffect>::from_seed(seed); match self.0.next(builder.as_visitor()) { ControlFlow::Continue(Status::Continue) => match builder.build() { Ok(value) => Ok(Some(value)), |