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