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