di_axum/
lib.rs

1#![doc = include_str!("README.md")]
2
3mod inject;
4mod inject_keyed;
5
6use axum::{
7    extract::{Request, State},
8    middleware::{from_fn_with_state, Next},
9    response::Response,
10    Router,
11};
12use di::ServiceProvider;
13
14pub use inject::*;
15pub use inject_keyed::*;
16
17#[cfg(test)]
18mod test_client;
19
20#[cfg(test)]
21pub(crate) use test_client::*;
22
23async fn services_middleware(
24    State(provider): State<ServiceProvider>,
25    mut request: Request,
26    next: Next,
27) -> Response {
28    request.extensions_mut().insert(provider.create_scope());
29    next.run(request).await
30}
31
32/// Provides [`axum::Router`] extension methods.
33pub trait RouterServiceProviderExtensions {
34    /// Adds the specified service provider to a router.
35    ///
36    /// # Arguments
37    ///
38    /// * `provider` - the [`di::ServiceProvider`] applied to the router
39    ///
40    /// # Remarks
41    ///
42    /// The service provider should be added after all routes are defined
43    /// in the same manner as middleware.
44    fn with_provider(self, provider: ServiceProvider) -> Self;
45}
46
47impl<S> RouterServiceProviderExtensions for Router<S>
48where
49    S: Clone + Send + Sync + 'static,
50{
51    fn with_provider(self, provider: ServiceProvider) -> Self {
52        self.route_layer(from_fn_with_state(provider, services_middleware))
53    }
54}