ferrous_di/provider/
context.rs1use crate::traits::{Resolver, ResolverCore};
7
8pub struct ResolverContext<'a> {
35 resolver: &'a dyn ResolverCore,
36}
37
38impl<'a> ResolverContext<'a> {
39 pub(crate) fn new<T>(resolver: &'a T) -> Self
41 where
42 T: ResolverCore,
43 {
44 Self { resolver }
45 }
46}
47
48impl<'a> ResolverCore for ResolverContext<'a> {
49 fn resolve_any(&self, key: &crate::Key) -> crate::DiResult<crate::registration::AnyArc> {
50 self.resolver.resolve_any(key)
51 }
52
53 fn resolve_many(&self, key: &crate::Key) -> crate::DiResult<Vec<crate::registration::AnyArc>> {
54 self.resolver.resolve_many(key)
55 }
56
57 fn push_sync_disposer(&self, f: Box<dyn FnOnce() + Send>) {
58 self.resolver.push_sync_disposer(f);
59 }
60
61 fn push_async_disposer(&self, f: Box<dyn FnOnce() -> crate::internal::BoxFutureUnit + Send>) {
62 self.resolver.push_async_disposer(f);
63 }
64}
65
66impl<'a> Resolver for ResolverContext<'a> {
67 fn register_disposer<T>(&self, service: std::sync::Arc<T>)
68 where
69 T: crate::traits::Dispose + 'static,
70 {
71 self.resolver.push_sync_disposer(Box::new(move || service.dispose()));
72 }
73
74 fn register_async_disposer<T>(&self, service: std::sync::Arc<T>)
75 where
76 T: crate::traits::AsyncDispose + 'static,
77 {
78 self.resolver.push_async_disposer(Box::new(move || {
79 let service = service.clone();
80 Box::pin(async move { service.dispose().await })
81 }));
82 }
83}