Diffstat (limited to 'tests/common/walker.rs')
| -rw-r--r-- | tests/common/walker.rs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/tests/common/walker.rs b/tests/common/walker.rs new file mode 100644 index 0000000..b1064f6 --- /dev/null +++ b/tests/common/walker.rs @@ -0,0 +1,57 @@ +use mockall::mock; +use treaty::{ + any::{indirect, AnyTrait, AnyTraitObject, TypeNameId}, + effect::{Effect, Future}, + protocol::DynVisitor, + Builder, BuilderTypes, Walker, WalkerTypes, +}; + +mock! { + pub Walker<Output, Error> { + pub fn walk<'a, 'ctx>(self, visitor: DynVisitor<'a, 'ctx>) -> Result<Output, Error>; + + pub fn traits(&self, id: TypeNameId) -> &Option<Box<dyn for<'ctx> AnyTrait<'ctx> + Send + Sync>>; + pub fn traits_mut(&mut self, id: TypeNameId) -> &mut Option<Box<dyn for<'ctx> AnyTrait<'ctx> + Send + Sync>>; + } +} + +impl<Output: Send + Sync, Error: Send + Sync> WalkerTypes for MockWalker<Output, Error> { + type Error = Error; + + type Output = Output; +} + +impl<'ctx, Output: Send + Sync, Error: Send + Sync, E: Effect> Walker<'ctx, E> + for MockWalker<Output, Error> +{ + fn walk<'a>( + self, + visitor: DynVisitor<'a, 'ctx>, + ) -> Future<'a, Result<Self::Output, Self::Error>, E> + where + Self: 'a, + { + E::ready(self.walk(visitor)) + } +} + +impl<'ctx, Output, Error> AnyTrait<'ctx> for MockWalker<Output, Error> { + fn upcast_to_id<'a>(&'a self, id: TypeNameId) -> Option<AnyTraitObject<'a, 'ctx, indirect::Ref>> + where + 'ctx: 'a, + { + self.traits(id).as_ref().and_then(|t| t.upcast_to_id(id)) + } + + fn upcast_to_id_mut<'a>( + &'a mut self, + id: TypeNameId, + ) -> Option<AnyTraitObject<'a, 'ctx, indirect::Mut>> + where + 'ctx: 'a, + { + self.traits_mut(id) + .as_mut() + .and_then(|t| t.upcast_to_id_mut(id)) + } +} |