TracedInject
				
					
				
			This commit is contained in:
		
							parent
							
								
									6e5302331c
								
							
						
					
					
						commit
						a10447457a
					
				| @ -1,27 +1,12 @@ | |||||||
| use crate::rstd::{cast::*, typeless::*}; | use crate::rstd::inject::*; | ||||||
| 
 | 
 | ||||||
| use super::*; | use super::*; | ||||||
| 
 | 
 | ||||||
| struct TracedResolver<'a, Ctx: Context<'a>> { | struct TracedInject; | ||||||
|     resolver: Rc<dyn Resolver<'a, Ctx>>, |  | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| impl<'a, Ctx: Context<'a, _Tm = TracedInstance>> TracedResolver<'a, Ctx> { | impl<'a, Ctx: Context<'a, _Tm = TracedInstance>> Inject<'a, Ctx> for TracedInject { | ||||||
|     fn wrap(resolver: Rc<dyn Resolver<'a, Ctx>>) -> Rc<dyn Resolver<'a, Ctx>> { |     fn inject<A: 'a>(&self, fa: Wrapped<'a, Ctx, A>) -> Wrapped<'a, Ctx, A> { | ||||||
|         Rc::new(Self { resolver }) |         fa.after_resolution() | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| impl<'a, Ctx: Context<'a, _Tm = TracedInstance>> Resolver<'a, Ctx> for TracedResolver<'a, Ctx> { |  | ||||||
|     fn resolve(self: Rc<Self>, address: Address) -> HashResolution<'a, Ctx> { |  | ||||||
|         self.resolver |  | ||||||
|             .clone() |  | ||||||
|             .resolve_map(address, |resolved| { |  | ||||||
|                 let (src, resolver) = resolved?; |  | ||||||
|                 let delayed: Rc<dyn Resolver<'a, Ctx>> = Rc::new(TracedResolver { resolver }); |  | ||||||
|                 Ok((src, delayed)) |  | ||||||
|             }) |  | ||||||
|             .after_resolution() |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -34,15 +19,9 @@ pub trait Traceable<'a, Ctx: Context<'a, _Tm = TracedInstance>>: | |||||||
|     ///
 |     ///
 | ||||||
|     /// [^extra]: applying [`Traceable::trace`] multiple times
 |     /// [^extra]: applying [`Traceable::trace`] multiple times
 | ||||||
|     /// might affect the trace in undesireable ways
 |     /// might affect the trace in undesireable ways
 | ||||||
|     fn trace(self: Rc<Self>) -> ParseResultA<'a, Ctx, Self>; |     fn trace(&self) -> ParseResultA<'a, Ctx, Self> { | ||||||
| } |         Rc::new(TracedInject).inject_mentionable(self) | ||||||
| 
 |  | ||||||
| impl<'a, Ctx: Context<'a, _Tm = TracedInstance>, A: Mentionable<'a, Ctx>> Traceable<'a, Ctx> for A |  | ||||||
| where |  | ||||||
|     Ctx::LookupError: From<CastError<'a>>, |  | ||||||
| { |  | ||||||
|     fn trace(self: Rc<Self>) -> ParseResultA<'a, Ctx, Self> { |  | ||||||
|         let factory = self.factory(); |  | ||||||
|         TypelessMentionable::from_typed(self).cast_full(factory, TracedResolver::wrap) |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | impl<'a, Ctx: Context<'a, _Tm = TracedInstance>, A: Mentionable<'a, Ctx>> Traceable<'a, Ctx> for A {} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user