use mockall::mock;
use treaty::{
any::{indirect, AnyTrait, AnyTraitObject, TypeNameId},
effect::{Effect, Effective, ErasedEffective},
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: 'c, 'c>(
self,
visitor: DynVisitor<'a, 'ctx>,
) -> ErasedEffective<'c, Result<Self::Output, Self::Error>, E>
where
Self: 'c,
{
E::ready(self.walk(visitor)).into_erased()
}
}
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))
}
}