Diffstat (limited to 'src/walk/walkers/core/struct.rs')
| -rw-r--r-- | src/walk/walkers/core/struct.rs | 151 |
1 files changed, 90 insertions, 61 deletions
diff --git a/src/walk/walkers/core/struct.rs b/src/walk/walkers/core/struct.rs index 88b597c..82e399d 100644 --- a/src/walk/walkers/core/struct.rs +++ b/src/walk/walkers/core/struct.rs @@ -3,7 +3,7 @@ use core::{any::TypeId, marker::PhantomData}; use crate::{ any::{AnyTrait, BorrowedStatic, BorrowedStaticHrt}, any_trait, - effect::{Effect, Effective, ErasedEffective}, + effect::{all_ctx, merge_ctx, Effect, Effective, EffectiveExt, ErasedEffective}, hkt::Marker, never::Never, protocol::{ @@ -13,8 +13,7 @@ use crate::{ SequenceScope, TagConst, TagDyn, TagError, TagHint, TagKnown, TagProto, ValueKnown, ValueProto, VisitResult, }, - walker::hint::{Hint, MetaKnown}, - walker::hint::{HintMeta, HintProto, MetaHint}, + walker::hint::{Hint, HintMeta, HintProto, MetaHint, MetaKnown}, DynVisitor, DynWalker, }, Flow, Status, WalkerTypes, TAG_FIELD_NAMES, TAG_MAP, TAG_STRUCT, TAG_TYPE_ID, TAG_TYPE_NAME, @@ -131,11 +130,13 @@ where { E::ready((self, visitor)) .as_ctx( + all_ctx, #[inline(always)] - |(this, visitor)| { + |(this, visitor), _| { RecoverableScope::<'ctx, E>::new_walk::<'_, '_, '_>(this, visitor.cast()) .into_erased() }, + merge_ctx, ) .map(|((this, _), _)| match this.error { Some(err) => Err(StructWalkError { kind: err }), @@ -627,80 +628,108 @@ where self.index = 0; E::ready((self, visitor)) - .as_ctx(|(this, visitor)| { - visit_request_hint::<E>(visitor.cast(), DynWalker(*this)) - .map(|result| match result { - VisitResult::Control(Flow::Continue) | VisitResult::Skipped(_) => None, - VisitResult::Control(Flow::Done) => Some(Ok(())), - VisitResult::Control(Flow::Err) => Some(Err(())), - }) - .into_erased() - }) - .as_ctx(|((this, visitor), result)| { - if result.is_some() { - E::ready(None).into_erased() - } else { - visit_sequence::<E>(visitor.cast(), *this) - .map(|result| match result { - VisitResult::Control(Flow::Continue) | VisitResult::Skipped(_) => None, - VisitResult::Control(Flow::Done) => Some(Ok(())), - VisitResult::Control(Flow::Err) => Some(Err(())), - }) - .into_erased() - } - }) - .map(|((ctx, result), other)| match (result, other) { - (Some(result), None) => (ctx, Some(result)), - (None, Some(result)) => (ctx, Some(result)), - (Some(_), Some(_)) => unreachable!(), - (None, None) => (ctx, None), - }) - .as_ctx(|((this, visitor), result)| { - if result.is_some() { - E::ready(None).into_erased() - } else { - visit_value::<_, E>(visitor.cast(), BorrowedStatic(this.value)) + .as_ctx( + all_ctx, + |(this, visitor), _| { + visit_request_hint::<E>(visitor.cast(), DynWalker(*this)) .map(|result| match result { VisitResult::Control(Flow::Continue) | VisitResult::Skipped(_) => None, VisitResult::Control(Flow::Done) => Some(Ok(())), VisitResult::Control(Flow::Err) => Some(Err(())), }) .into_erased() - } - }) + }, + merge_ctx, + ) + .as_ctx( + all_ctx, + |((this, visitor), result), _| { + if result.is_some() { + E::ready(None).into_erased() + } else { + visit_sequence::<E>(visitor.cast(), *this) + .map(|result| match result { + VisitResult::Control(Flow::Continue) | VisitResult::Skipped(_) => { + None + } + VisitResult::Control(Flow::Done) => Some(Ok(())), + VisitResult::Control(Flow::Err) => Some(Err(())), + }) + .into_erased() + } + }, + merge_ctx, + ) .map(|((ctx, result), other)| match (result, other) { (Some(result), None) => (ctx, Some(result)), (None, Some(result)) => (ctx, Some(result)), (Some(_), Some(_)) => unreachable!(), (None, None) => (ctx, None), }) - .as_ctx(|((this, visitor), result)| { - if result.is_some() { - E::ready(None).into_erased() - } else { - visit_tag::<TagConst<{ TAG_TYPE_ID.to_int() }>, E, _>( - TagConst, - visitor.cast(), - ValueWalker::new(TypeId::of::<I::T>()), - ) + .as_ctx_or_else(|(this, visitor)| { + // .as_ctx(all_ctx, |((this, visitor), result), _| { + // if result.is_some() { + // E::ready(None).into_erased() + // } else { + visit_value::<_, E>(visitor.cast(), BorrowedStatic(this.value)) .map(|result| match result { - Err(err) => { - this.error = Some(StructWalkErrorKind::Tag(err)); - Some(Err(())) - } - Ok(VisitResult::Control(Flow::Continue) | VisitResult::Skipped(_)) => None, - Ok(VisitResult::Control(Flow::Done)) => Some(Ok(())), - Ok(VisitResult::Control(Flow::Err)) => Some(Err(())), + VisitResult::Control(Flow::Continue) | VisitResult::Skipped(_) => None, + VisitResult::Control(Flow::Done) => Some(Ok(())), + VisitResult::Control(Flow::Err) => Some(Err(())), }) .into_erased() - } + // } + // }) + // .map(|((ctx, result), other)| match (result, other) { + // (Some(result), None) => (ctx, Some(result)), + // (None, Some(result)) => (ctx, Some(result)), + // (Some(_), Some(_)) => unreachable!(), + // (None, None) => (ctx, None), }) - .map(|((ctx, result), other)| match (result, other) { - (Some(result), None) => (ctx, Some(result)), - (None, Some(result)) => (ctx, Some(result)), - (Some(_), Some(_)) => unreachable!(), - (None, None) => (ctx, None), + .as_ctx_or_else(|(this, visitor)| { + visit_tag::<TagConst<{ TAG_TYPE_ID.to_int() }>, E, _>( + TagConst, + visitor.cast(), + ValueWalker::new(TypeId::of::<I::T>()), + ) + .map(|result| match result { + Err(err) => { + this.error = Some(StructWalkErrorKind::Tag(err)); + Some(Err(())) + } + Ok(VisitResult::Control(Flow::Continue) | VisitResult::Skipped(_)) => None, + Ok(VisitResult::Control(Flow::Done)) => Some(Ok(())), + Ok(VisitResult::Control(Flow::Err)) => Some(Err(())), + }) + .into_erased() }) + // .as_ctx(all_ctx, |((this, visitor), result), _| { + // if result.is_some() { + // E::ready(None).into_erased() + // } else { + // visit_tag::<TagConst<{ TAG_TYPE_ID.to_int() }>, E, _>( + // TagConst, + // visitor.cast(), + // ValueWalker::new(TypeId::of::<I::T>()), + // ) + // .map(|result| match result { + // Err(err) => { + // this.error = Some(StructWalkErrorKind::Tag(err)); + // Some(Err(())) + // } + // Ok(VisitResult::Control(Flow::Continue) | VisitResult::Skipped(_)) => None, + // Ok(VisitResult::Control(Flow::Done)) => Some(Ok(())), + // Ok(VisitResult::Control(Flow::Err)) => Some(Err(())), + // }) + // .into_erased() + // } + // }) + // .map(|((ctx, result), other)| match (result, other) { + // (Some(result), None) => (ctx, Some(result)), + // (None, Some(result)) => (ctx, Some(result)), + // (Some(_), Some(_)) => unreachable!(), + // (None, None) => (ctx, None), + // }) .map(|(_, value)| match value { None => Ok(()), Some(value) => value, |