pub trait Extract: Sized {
// Required method
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<Self, InjectableError>> + Send + 'async_trait>>
where 'life0: 'async_trait,
Self: 'async_trait;
}Expand description
Axum-inspired extractor trait for dependency resolution.
Types that implement Extract can be pulled from a ResolveContext
without any TypeId or dynamic downcasting. The generated provider code
calls <Inject<Database> as Extract>::extract(ctx).await? for each
constructor parameter.
§Implementations
This trait is automatically implemented for:
Inject<T>whenT: Injectable— shared (Arc) accessTwhenT: Injectable— owned value accessOption<T>whenT: Extract— optional dependency
Users never need to implement Extract manually.
Required Methods§
Sourcefn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<Self, InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<Self, InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
Self: 'async_trait,
Extract a value from the given resolution context.
This is the core resolution method. It is called by generated provider code for each constructor parameter or struct field marked with an extractor type.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".
Implementations on Foreign Types§
Source§impl Extract for ()
Extract for the unit type — always succeeds with ().
impl Extract for ()
Extract for the unit type — always succeeds with ().
Useful as a factory input when no context value is needed.
Source§impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
T12: Extract + Send + Sync + 'static,
T13: Extract + Send + Sync + 'static,
T14: Extract + Send + Sync + 'static,
T15: Extract + Send + Sync + 'static,
T16: Extract + Send + Sync + 'static,
impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
T12: Extract + Send + Sync + 'static,
T13: Extract + Send + Sync + 'static,
T14: Extract + Send + Sync + 'static,
T15: Extract + Send + Sync + 'static,
T16: Extract + Send + Sync + 'static,
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16): 'async_trait,
Source§impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
T12: Extract + Send + Sync + 'static,
T13: Extract + Send + Sync + 'static,
T14: Extract + Send + Sync + 'static,
T15: Extract + Send + Sync + 'static,
impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
T12: Extract + Send + Sync + 'static,
T13: Extract + Send + Sync + 'static,
T14: Extract + Send + Sync + 'static,
T15: Extract + Send + Sync + 'static,
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15): 'async_trait,
Source§impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
T12: Extract + Send + Sync + 'static,
T13: Extract + Send + Sync + 'static,
T14: Extract + Send + Sync + 'static,
impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
T12: Extract + Send + Sync + 'static,
T13: Extract + Send + Sync + 'static,
T14: Extract + Send + Sync + 'static,
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14): 'async_trait,
Source§impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
T12: Extract + Send + Sync + 'static,
T13: Extract + Send + Sync + 'static,
impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
T12: Extract + Send + Sync + 'static,
T13: Extract + Send + Sync + 'static,
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13): 'async_trait,
Source§impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
T12: Extract + Send + Sync + 'static,
impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
T12: Extract + Send + Sync + 'static,
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12): 'async_trait,
Source§impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
T11: Extract + Send + Sync + 'static,
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11): 'async_trait,
Source§impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
T10: Extract + Send + Sync + 'static,
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10): 'async_trait,
Source§impl<T1, T2, T3, T4, T5, T6, T7, T8, T9> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
impl<T1, T2, T3, T4, T5, T6, T7, T8, T9> Extract for (T1, T2, T3, T4, T5, T6, T7, T8, T9)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
T9: Extract + Send + Sync + 'static,
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5, T6, T7, T8, T9), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5, T6, T7, T8, T9): 'async_trait,
Source§impl<T1, T2, T3, T4, T5, T6, T7, T8> Extract for (T1, T2, T3, T4, T5, T6, T7, T8)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
impl<T1, T2, T3, T4, T5, T6, T7, T8> Extract for (T1, T2, T3, T4, T5, T6, T7, T8)where
T1: Extract + Send + Sync + 'static,
T2: Extract + Send + Sync + 'static,
T3: Extract + Send + Sync + 'static,
T4: Extract + Send + Sync + 'static,
T5: Extract + Send + Sync + 'static,
T6: Extract + Send + Sync + 'static,
T7: Extract + Send + Sync + 'static,
T8: Extract + Send + Sync + 'static,
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5, T6, T7, T8), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5, T6, T7, T8): 'async_trait,
Source§impl<T1, T2, T3, T4, T5, T6, T7> Extract for (T1, T2, T3, T4, T5, T6, T7)
impl<T1, T2, T3, T4, T5, T6, T7> Extract for (T1, T2, T3, T4, T5, T6, T7)
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5, T6, T7), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5, T6, T7): 'async_trait,
Source§impl<T1, T2, T3, T4, T5, T6> Extract for (T1, T2, T3, T4, T5, T6)
impl<T1, T2, T3, T4, T5, T6> Extract for (T1, T2, T3, T4, T5, T6)
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5, T6), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5, T6): 'async_trait,
Source§impl<T1, T2, T3, T4, T5> Extract for (T1, T2, T3, T4, T5)
impl<T1, T2, T3, T4, T5> Extract for (T1, T2, T3, T4, T5)
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4, T5), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4, T5): 'async_trait,
Source§impl<T1, T2, T3, T4> Extract for (T1, T2, T3, T4)
impl<T1, T2, T3, T4> Extract for (T1, T2, T3, T4)
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3, T4), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3, T4): 'async_trait,
Source§impl<T1, T2, T3> Extract for (T1, T2, T3)
impl<T1, T2, T3> Extract for (T1, T2, T3)
fn extract<'life0, 'async_trait>(
ctx: &'life0 ResolveContext,
) -> Pin<Box<dyn Future<Output = Result<(T1, T2, T3), InjectableError>> + Send + 'async_trait>>where
'life0: 'async_trait,
(T1, T2, T3): 'async_trait,
Source§impl<T> Extract for Option<T>
Blanket Extract implementation for Option<T> where T: Extract.
impl<T> Extract for Option<T>
Blanket Extract implementation for Option<T> where T: Extract.
If the inner extraction fails with MissingDependency, this returns
None instead of propagating the error. Other errors are propagated.
Note: This impl takes priority over the T: Injectable blanket impl
for Option<T> because Option<T> does not implement Injectable.
Implementors§
impl<T> Extract for Arc<T>where
T: Injectable,
Extract for Arc<T> where T: Injectable.
Defined inside injectable_rs_runtime (where Extract is local) so the orphan
rule is satisfied. This replaces the previous special-case codegen for
Arc<T> fields — the Extract impl lives in one place and any
Arc<WeatherService> field just works without annotation.
Singletons: returns the cached Arc (same pointer every call).
Transients: wraps a fresh instance in Arc::new.
impl<T> Extract for Inject<T>
Extract implementation for Inject<T> where T: Sized + Send + Sync + 'static.
Resolution order:
- Try
resolve_external::<Arc<T>>()— findsInjectableArcFactoryentries submitted by#[injectable]macros. These entries callresolve_singleton_arcinternally, so singletons are properly cached. - Fall back to
resolve_external::<T>()— findsDynProvider<T>registrations for external types, then wraps the result inArc::new.