Skip to main content

rust_dix/
bridge.rs

1//! Unified provider trait for service resolution and named registry access.
2
3use std::any::Any;
4use std::sync::Arc;
5
6use crate::entry::IServiceResolver;
7use crate::provider::ServiceProvider;
8use crate::scope::Scope;
9use crate::wrapper::ServiceProviderWrapper;
10
11/// Unified provider trait for service resolution and named registry access.
12///
13/// `ServiceProvider`, `Scope`, and `ServiceProviderWrapper` all implement this
14/// trait, enabling polymorphic dispatch via `Arc<dyn IProvider>` instead of
15/// enum matching.
16pub trait IProvider: IServiceResolver {
17    fn get_named_any(&self, name: &str) -> Option<Arc<dyn Any + Send + Sync>>;
18    fn rdi_register_named(&self, name: &str, service: Arc<dyn Any + Send + Sync>);
19    fn rdi_remove_named(&self, name: &str);
20}
21
22impl IProvider for ServiceProvider {
23    fn get_named_any(&self, name: &str) -> Option<Arc<dyn Any + Send + Sync>> {
24        ServiceProvider::get_named_any(self, name)
25    }
26    fn rdi_register_named(&self, name: &str, service: Arc<dyn Any + Send + Sync>) {
27        ServiceProvider::rdi_register_named(self, name, service);
28    }
29    fn rdi_remove_named(&self, name: &str) {
30        ServiceProvider::rdi_remove_named(self, name);
31    }
32}
33
34impl IProvider for ServiceProviderWrapper {
35    fn get_named_any(&self, name: &str) -> Option<Arc<dyn Any + Send + Sync>> {
36        ServiceProviderWrapper::get_named_any(self, name)
37    }
38    fn rdi_register_named(&self, name: &str, service: Arc<dyn Any + Send + Sync>) {
39        ServiceProviderWrapper::rdi_register_named(self, name, service);
40    }
41    fn rdi_remove_named(&self, name: &str) {
42        ServiceProviderWrapper::rdi_remove_named(self, name);
43    }
44}
45
46impl IProvider for Scope {
47    fn get_named_any(&self, name: &str) -> Option<Arc<dyn Any + Send + Sync>> {
48        Scope::get_named_any(self, name)
49    }
50    fn rdi_register_named(&self, name: &str, service: Arc<dyn Any + Send + Sync>) {
51        Scope::rdi_register_named(self, name, service);
52    }
53    fn rdi_remove_named(&self, name: &str) {
54        Scope::rdi_remove_named(self, name);
55    }
56}