a3s_boot/provider/
provider_ref.rs1use super::{ContextId, ModuleRef, ProviderToken};
2use crate::Result;
3use std::fmt;
4use std::marker::PhantomData;
5use std::sync::Arc;
6
7#[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}