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))
}
}