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
32pub trait RouterServiceProviderExtensions {
34 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}