Diffstat (limited to 'src/build/builders/serde/deserialize.rs')
-rw-r--r--src/build/builders/serde/deserialize.rs47
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)),