Diffstat (limited to 'src/walk.rs')
-rw-r--r--src/walk.rs24
1 files changed, 14 insertions, 10 deletions
diff --git a/src/walk.rs b/src/walk.rs
index 0dbccee..c99251d 100644
--- a/src/walk.rs
+++ b/src/walk.rs
@@ -11,6 +11,7 @@ pub trait Walk<'ctx, M, E: Effect<'ctx>>: WalkerTypes + Sized {
/// The walker for the type.
type Walker: Walker<'ctx, E, Error = Self::Error, Output = Self::Output>;
+ #[must_use]
fn into_walker(self) -> Self::Walker;
}
@@ -48,14 +49,11 @@ pub trait WalkerObjSafe<'ctx, E: Effect<'ctx>>: Send {
fn walk<'a>(&'a mut self, visitor: Visitor<'a, 'ctx>) -> Future<'a, 'ctx, Flow, E>
where
Self: 'a;
-
- fn skip(&mut self);
}
pub type DynWalker<'a, 'ctx, E> = &'a mut (dyn WalkerObjSafe<'ctx, E> + Send + 'a);
enum DynWalkerState<W: WalkerTypes> {
- Skipped,
Walking,
Pending(W),
Done(W::Output),
@@ -70,6 +68,8 @@ pub enum DynWalkerError<W: WalkerTypes> {
WalkNeverFinished,
Walker(W::Error),
+
+ WasWalked(W::Output),
}
pub struct DynWalkerAdapter<W: WalkerTypes> {
@@ -83,12 +83,20 @@ impl<W: WalkerTypes> DynWalkerAdapter<W> {
}
}
- pub fn finish(self) -> Result<Option<W::Output>, DynWalkerError<W>> {
+ pub fn finish(self) -> Result<W::Output, DynWalkerError<W>> {
match self.state {
- DynWalkerState::Skipped => Ok(None),
DynWalkerState::Walking => Err(DynWalkerError::WalkNeverFinished),
DynWalkerState::Pending(walker) => Err(DynWalkerError::NeverWalked(walker)),
- DynWalkerState::Done(value) => Ok(Some(value)),
+ DynWalkerState::Done(value) => Ok(value),
+ DynWalkerState::Err(err) => Err(DynWalkerError::Walker(err)),
+ }
+ }
+
+ pub fn into_innter(self) -> Result<W, DynWalkerError<W>> {
+ match self.state {
+ DynWalkerState::Walking => Err(DynWalkerError::WalkNeverFinished),
+ DynWalkerState::Pending(walker) => Ok(walker),
+ DynWalkerState::Done(value) => Err(DynWalkerError::WasWalked(value)),
DynWalkerState::Err(err) => Err(DynWalkerError::Walker(err)),
}
}
@@ -123,8 +131,4 @@ impl<'ctx, W: Walker<'ctx, E>, E: Effect<'ctx>> WalkerObjSafe<'ctx, E> for DynWa
}
})
}
-
- fn skip(&mut self) {
- self.state = DynWalkerState::Skipped;
- }
}