Skip to main content

modo_db/
extractor.rs

1use crate::pool::DbPool;
2use modo::app::AppState;
3use modo::axum::extract::FromRequestParts;
4use modo::axum::http::request::Parts;
5use modo::error::Error;
6
7/// Axum extractor for the database connection pool.
8///
9/// Usage: `Db(db): Db` in handler parameters.
10///
11/// Requires `DbPool` to be registered via `app.managed_service(db)`.
12#[derive(Debug, Clone)]
13pub struct Db(pub DbPool);
14
15impl FromRequestParts<AppState> for Db {
16    type Rejection = Error;
17
18    async fn from_request_parts(
19        _parts: &mut Parts,
20        state: &AppState,
21    ) -> Result<Self, Self::Rejection> {
22        state
23            .services
24            .get::<DbPool>()
25            .map(|pool| Db((*pool).clone()))
26            .ok_or_else(|| {
27                Error::internal(
28                    "Database not configured. Register DbPool via app.managed_service(db).",
29                )
30            })
31    }
32}