Skip to main content

a3s_boot/provider/
provider_ref.rs

1use super::{ContextId, ModuleRef, ProviderToken};
2use crate::Result;
3use std::fmt;
4use std::marker::PhantomData;
5use std::sync::Arc;
6
7/// Lazy provider handle for forward-reference-style dependencies.
8#[derive(Clone)]
9pub struct ProviderRef<T> {
10    module_ref: ModuleRef,
11    token: ProviderToken,
12    _marker: PhantomData<fn() -> T>,
13}
14
15impl<T> fmt::Debug for ProviderRef<T> {
16    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
17        f.debug_struct("ProviderRef")
18            .field("token", &self.token)
19            .finish_non_exhaustive()
20    }
21}
22
23impl<T> ProviderRef<T>
24where
25    T: Send + Sync + 'static,
26{
27    pub fn new(module_ref: ModuleRef, token: ProviderToken) -> Self {
28        Self {
29            module_ref: module_ref.without_resolution_stack(),
30            token,
31            _marker: PhantomData,
32        }
33    }
34
35    pub fn token(&self) -> &ProviderToken {
36        &self.token
37    }
38
39    pub fn module_ref(&self) -> &ModuleRef {
40        &self.module_ref
41    }
42
43    pub fn get(&self) -> Result<Arc<T>> {
44        self.module_ref.get_token(&self.token)
45    }
46
47    pub fn get_optional(&self) -> Result<Option<Arc<T>>> {
48        self.module_ref.get_optional_token(&self.token)
49    }
50
51    pub fn resolve(&self) -> Result<Arc<T>> {
52        self.module_ref.resolve_token(&self.token)
53    }
54
55    pub fn resolve_with_context(&self, context_id: &ContextId) -> Result<Arc<T>> {
56        self.module_ref
57            .resolve_token_with_context(&self.token, context_id)
58    }
59
60    pub fn resolve_optional(&self) -> Result<Option<Arc<T>>> {
61        self.module_ref.resolve_optional_token(&self.token)
62    }
63
64    pub fn resolve_optional_with_context(&self, context_id: &ContextId) -> Result<Option<Arc<T>>> {
65        self.module_ref
66            .resolve_optional_token_with_context(&self.token, context_id)
67    }
68}