Diffstat (limited to 'tests/common/protocol/hint.rs')
| -rw-r--r-- | tests/common/protocol/hint.rs | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/tests/common/protocol/hint.rs b/tests/common/protocol/hint.rs new file mode 100644 index 0000000..bcc2a02 --- /dev/null +++ b/tests/common/protocol/hint.rs @@ -0,0 +1,46 @@ +use mockall::mock; +use treaty::{ + any::{any_trait, TypeName}, + effect::{Effect, Future}, + protocol::{ + walker::hint::{Hint, HintMeta, HintProto, Known}, + Visitor, + }, + Flow, +}; + +pub type KnownFactory<P> = + for<'a, 'ctx> fn(&'ctx (), &'a <P as HintMeta>::Hint) -> Result<Known<'a, 'ctx, P>, ()>; + +mock! { + pub HintVisitor<P: HintMeta, E> { + pub fn hint<'a, 'ctx>(&'a mut self, visitor: Visitor<'a, 'ctx>, hint: <P as HintMeta>::Hint) -> Flow; + + pub fn known(&self) -> KnownFactory<P>; + } +} + +any_trait! { + impl['ctx, P, E] MockHintVisitor<P, E> = [ + HintProto<P, E> + ] where + P: HintMeta, + E: Effect, +} + +impl<'ctx, P: HintMeta, E: Effect> Hint<'ctx, P, E> for MockHintVisitor<P, E> { + fn hint<'a>( + &'a mut self, + visitor: Visitor<'a, 'ctx>, + hint: <P as HintMeta>::Hint, + ) -> Future<'a, Flow, E> { + E::ready(self.hint(visitor, hint)) + } + + fn known<'a>( + &'a mut self, + hint: &'a <P as HintMeta>::Hint, + ) -> Future<'a, Result<Known<'a, 'ctx, P>, ()>, E> { + E::ready(Self::known(self)(&(), hint)) + } +} |