Diffstat (limited to 'src/walk.rs')
| -rw-r--r-- | src/walk.rs | 24 |
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; - } } |