Diffstat (limited to 'src/walk/walkers/core/struct.rs')
-rw-r--r--src/walk/walkers/core/struct.rs151
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,