Diffstat (limited to 'src/walk/walkers/core/struct.rs')
-rw-r--r--src/walk/walkers/core/struct.rs133
1 files changed, 71 insertions, 62 deletions
diff --git a/src/walk/walkers/core/struct.rs b/src/walk/walkers/core/struct.rs
index 406e703..c6a2c8f 100644
--- a/src/walk/walkers/core/struct.rs
+++ b/src/walk/walkers/core/struct.rs
@@ -1,19 +1,22 @@
use core::any::TypeId;
use crate::{
- any::static_wrapper::{BorrowedStatic, DynBorrowedStatic}, any_trait, effect::{Effect, Future}, hkt::Marker, never::Never, protocol::{
+ any::BorrowedStatic,
+ any_trait,
+ effect::{Effect, Future},
+ hkt::Marker,
+ never::Never,
+ protocol::{
visitor::{
- recoverable::{visit_recoverable, DynRecoverable, RecoverableScope},
- request_hint::visit_request_hint,
- sequence::{visit_sequence, DynSequence, SequenceKnown, SequenceScope},
- tag::{visit_tag, DynTag, TagConst, TagDyn, TagError, TagHint, TagKnown},
- value::{visit_value, DynValue, ValueKnown},
- Status,
+ visit_recoverable, visit_request_hint, visit_sequence, visit_tag, visit_value,
+ DynRecoverable, DynSequence, DynTag, DynValue, RecoverableScope, SequenceKnown,
+ SequenceScope, TagConst, TagDyn, TagError, TagHint, TagKnown, ValueKnown, VisitResult,
},
walker::hint::{DynHint, HintMeta},
walker::hint::{Hint, Known},
Visitor,
- }, Flow, WalkerTypes, TAG_FIELD_NAMES, TAG_MAP, TAG_STRUCT, TAG_TYPE_ID, TAG_TYPE_NAME
+ },
+ Flow, Status, WalkerTypes, TAG_FIELD_NAMES, TAG_MAP, TAG_STRUCT, TAG_TYPE_ID, TAG_TYPE_NAME,
};
use super::{noop::NoopWalker, tag::StaticSliceWalker, value::ValueWalker};
@@ -135,7 +138,7 @@ any_trait! {
impl['ctx, T, I, M, E] StructWalker<'ctx, T, I, M, E> = [
DynHint<'ctx, DynRecoverable<'ctx, E>, E>,
DynHint<'ctx, DynSequence<'ctx, E>, E>,
- DynHint<'ctx, DynValue<'ctx, DynBorrowedStatic<'ctx, T>, E>, E>,
+ DynHint<'ctx, DynValue<'ctx, BorrowedStatic<'ctx, T>, E>, E>,
DynHint<'ctx, DynTag<'ctx, TagDyn, E>, E>,
DynHint<'ctx, DynTag<'ctx, TagConst<{ TAG_TYPE_ID.to_int() }>, E>, E>,
DynHint<'ctx, DynTag<'ctx, TagConst<{ TAG_STRUCT.to_int() }>, E>, E>,
@@ -162,8 +165,8 @@ where
E::map(
visit_recoverable::<E>(visitor, self),
|status| match status {
- Status::Skipped(_) => Flow::Continue,
- Status::Flow(flow) => flow,
+ VisitResult::Skipped(_) => Flow::Continue,
+ VisitResult::Control(flow) => flow,
},
)
}
@@ -197,10 +200,10 @@ where
|status| match status {
Err(err) => {
self.error = Some(StructWalkErrorKind::FieldTag(err));
- Flow::Break
+ Flow::Err
}
- Ok(Status::Skipped(_)) => Flow::Continue,
- Ok(Status::Flow(flow)) => flow,
+ Ok(VisitResult::Skipped(_)) => Flow::Continue,
+ Ok(VisitResult::Control(flow)) => flow,
},
)
}
@@ -210,7 +213,8 @@ where
_hint: &'a <DynTag<'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E> as HintMeta<
'ctx,
>>::Hint,
- ) -> Future<'a,
+ ) -> Future<
+ 'a,
Result<Known<'a, 'ctx, DynTag<'ctx, TagConst<{ TAG_FIELD_NAMES.to_int() }>, E>>, ()>,
E,
> {
@@ -241,10 +245,10 @@ where
|status| match status {
Err(err) => {
self.error = Some(StructWalkErrorKind::Tag(err));
- Flow::Break
+ Flow::Err
}
- Ok(Status::Skipped(_)) => Flow::Continue,
- Ok(Status::Flow(flow)) => flow,
+ Ok(VisitResult::Skipped(_)) => Flow::Continue,
+ Ok(VisitResult::Control(flow)) => flow,
},
)
}
@@ -280,10 +284,10 @@ where
|status| match status {
Err(err) => {
self.error = Some(StructWalkErrorKind::Tag(err));
- Flow::Break
+ Flow::Err
}
- Ok(Status::Skipped(_)) => Flow::Continue,
- Ok(Status::Flow(flow)) => flow,
+ Ok(VisitResult::Skipped(_)) => Flow::Continue,
+ Ok(VisitResult::Control(flow)) => flow,
},
)
}
@@ -291,11 +295,8 @@ where
fn known<'a>(
&'a mut self,
_hint: &'a <DynTag<'ctx, TagConst<{ TAG_MAP.to_int() }>, E> as HintMeta<'ctx>>::Hint,
- ) -> Future<
- 'a,
- Result<Known<'a, 'ctx, DynTag<'ctx, TagConst<{ TAG_MAP.to_int() }>, E>>, ()>,
- E,
- > {
+ ) -> Future<'a, Result<Known<'a, 'ctx, DynTag<'ctx, TagConst<{ TAG_MAP.to_int() }>, E>>, ()>, E>
+ {
E::ready(Ok(TagKnown {
kind_available: Some(true),
}))
@@ -323,10 +324,10 @@ where
|status| match status {
Err(err) => {
self.error = Some(StructWalkErrorKind::Tag(err));
- Flow::Break
+ Flow::Err
}
- Ok(Status::Skipped(_)) => Flow::Continue,
- Ok(Status::Flow(flow)) => flow,
+ Ok(VisitResult::Skipped(_)) => Flow::Continue,
+ Ok(VisitResult::Control(flow)) => flow,
},
)
}
@@ -366,10 +367,10 @@ where
|status| match status {
Err(err) => {
self.error = Some(StructWalkErrorKind::Tag(err));
- Flow::Break
+ Flow::Err
}
- Ok(Status::Skipped(_)) => Flow::Continue,
- Ok(Status::Flow(flow)) => flow,
+ Ok(VisitResult::Skipped(_)) => Flow::Continue,
+ Ok(VisitResult::Control(flow)) => flow,
},
)
}
@@ -448,7 +449,7 @@ where
}
}
-impl<'ctx, T, I, M, E> Hint<'ctx, DynValue<'ctx, DynBorrowedStatic<'ctx, T>, E>, E>
+impl<'ctx, T, I, M, E> Hint<'ctx, DynValue<'ctx, BorrowedStatic<'ctx, T>, E>, E>
for StructWalker<'ctx, T, I, M, E>
where
E: Effect,
@@ -459,8 +460,8 @@ where
E::map(
visit_value::<_, E>(visitor, BorrowedStatic(self.value)),
|status| match status {
- Status::Skipped(_) => Flow::Continue,
- Status::Flow(flow) => flow,
+ VisitResult::Skipped(_) => Flow::Continue,
+ VisitResult::Control(flow) => flow,
},
)
}
@@ -482,8 +483,8 @@ where
_hint: <DynSequence<'ctx, E> as HintMeta<'ctx>>::Hint,
) -> Future<'a, Flow, E> {
E::map(visit_sequence::<E>(visitor, self), |status| match status {
- Status::Skipped(_) => Flow::Continue,
- Status::Flow(flow) => flow,
+ VisitResult::Skipped(_) => Flow::Continue,
+ VisitResult::Control(flow) => flow,
})
}
@@ -525,7 +526,7 @@ where
Err(err) => {
// Record the error and signal a break.
self.error = Some(StructWalkErrorKind::Field(err));
- Flow::Break
+ Flow::Err
}
},
)
@@ -538,7 +539,7 @@ where
I: StructTypeInfo<'ctx, M, T = T>,
T: Sync + 'static,
{
- fn new_walk<'a>(&'a mut self, visitor: Visitor<'a, 'ctx>) -> Future<'a, Flow, E> {
+ fn new_walk<'a>(&'a mut self, visitor: Visitor<'a, 'ctx>) -> Future<'a, Status, E> {
// Reset the errors to default state.
self.error = None;
@@ -548,14 +549,16 @@ where
E::wrap(async move {
// We should check if the visitor wants something specific.
match visit_request_hint::<E>(visitor, self).await {
- Flow::Continue => {}
- flow => return flow,
+ VisitResult::Skipped(_) | VisitResult::Control(Flow::Continue) => {}
+ VisitResult::Control(Flow::Done) => return Ok(()),
+ VisitResult::Control(Flow::Err) => return Err(()),
}
// Attempt to visit the value directly.
match visit_value::<_, E>(visitor, BorrowedStatic(self.value)).await {
- Status::Skipped(_) | Status::Flow(Flow::Continue) => {}
- Status::Flow(flow) => return flow,
+ VisitResult::Skipped(_) | VisitResult::Control(Flow::Continue) => {}
+ VisitResult::Control(Flow::Done) => return Ok(()),
+ VisitResult::Control(Flow::Err) => return Err(()),
}
// Follow the standard set of protocols for a struct.
@@ -574,10 +577,11 @@ where
{
Err(err) => {
self.error = Some(StructWalkErrorKind::Tag(err));
- return Flow::Break;
+ return Err(());
}
- Ok(Status::Skipped(_)) | Ok(Status::Flow(Flow::Continue)) => {}
- Ok(Status::Flow(flow)) => return flow,
+ Ok(VisitResult::Skipped(_)) | Ok(VisitResult::Control(Flow::Continue)) => {}
+ Ok(VisitResult::Control(Flow::Done)) => return Ok(()),
+ Ok(VisitResult::Control(Flow::Err)) => return Err(()),
}
match visit_tag::<TagConst<{ TAG_STRUCT.to_int() }>, E, _>(
@@ -587,7 +591,7 @@ where
)
.await
{
- Ok(Status::Skipped(_)) => {
+ Ok(VisitResult::Skipped(_)) => {
match visit_tag::<TagConst<{ TAG_MAP.to_int() }>, E, _>(
TagConst,
visitor,
@@ -597,18 +601,20 @@ where
{
Err(err) => {
self.error = Some(StructWalkErrorKind::Tag(err));
- return Flow::Break;
+ return Err(());
}
- Ok(Status::Skipped(_)) | Ok(Status::Flow(Flow::Continue)) => {}
- Ok(Status::Flow(flow)) => return flow,
+ Ok(VisitResult::Skipped(_)) | Ok(VisitResult::Control(Flow::Continue)) => {}
+ Ok(VisitResult::Control(Flow::Done)) => return Ok(()),
+ Ok(VisitResult::Control(Flow::Err)) => return Err(()),
}
}
Err(err) => {
self.error = Some(StructWalkErrorKind::Tag(err));
- return Flow::Break;
+ return Err(());
}
- Ok(Status::Flow(Flow::Continue)) => {}
- Ok(Status::Flow(flow)) => return flow,
+ Ok(VisitResult::Control(Flow::Continue)) => {}
+ Ok(VisitResult::Control(Flow::Done)) => return Ok(()),
+ Ok(VisitResult::Control(Flow::Err)) => return Err(()),
}
match visit_tag::<TagConst<{ TAG_TYPE_NAME.to_int() }>, E, _>(
@@ -620,10 +626,11 @@ where
{
Err(err) => {
self.error = Some(StructWalkErrorKind::Tag(err));
- return Flow::Break;
+ return Err(());
}
- Ok(Status::Skipped(_)) | Ok(Status::Flow(Flow::Continue)) => {}
- Ok(Status::Flow(flow)) => return flow,
+ Ok(VisitResult::Skipped(_)) | Ok(VisitResult::Control(Flow::Continue)) => {}
+ Ok(VisitResult::Control(Flow::Done)) => return Ok(()),
+ Ok(VisitResult::Control(Flow::Err)) => return Err(()),
}
match visit_tag::<TagConst<{ TAG_FIELD_NAMES.to_int() }>, E, _>(
@@ -635,18 +642,20 @@ where
{
Err(err) => {
self.error = Some(StructWalkErrorKind::FieldTag(err));
- return Flow::Break;
+ return Err(());
}
- Ok(Status::Skipped(_)) | Ok(Status::Flow(Flow::Continue)) => {}
- Ok(Status::Flow(flow)) => return flow,
+ Ok(VisitResult::Skipped(_)) | Ok(VisitResult::Control(Flow::Continue)) => {}
+ Ok(VisitResult::Control(Flow::Done)) => return Ok(()),
+ Ok(VisitResult::Control(Flow::Err)) => return Err(()),
}
match visit_sequence::<E>(visitor, self).await {
- Status::Flow(Flow::Continue) | Status::Skipped(_) => {}
- Status::Flow(flow) => return flow,
+ VisitResult::Control(Flow::Continue) | VisitResult::Skipped(_) => {}
+ VisitResult::Control(Flow::Done) => return Ok(()),
+ VisitResult::Control(Flow::Err) => return Err(()),
}
- Flow::Continue
+ Ok(())
})
}
}