db_pool/async/backend/common/pool/diesel/
deadpool.rs

1use std::ops::DerefMut;
2
3use async_trait::async_trait;
4use deadpool::managed::{
5    BuildError, Manager as DeadpoolManager, Object, Pool, PoolBuilder,
6    PoolError as DeadpoolPoolError,
7};
8use diesel::{ConnectionError, result::Error as DieselError};
9use diesel_async::{
10    AsyncConnection,
11    pooled_connection::{AsyncDieselConnectionManager, PoolError as DieselPoolError},
12};
13
14use crate::r#async::backend::error::Error as BackendError;
15
16use super::r#trait::DieselPoolAssociation;
17
18type DieselManager<Connection> = AsyncDieselConnectionManager<Connection>;
19
20/// [`Diesel deadpool`](https://docs.rs/diesel-async/0.5.2/diesel_async/pooled_connection/deadpool/index.html) association
21pub struct DieselDeadpool;
22
23#[async_trait]
24impl<Connection> DieselPoolAssociation<Connection> for DieselDeadpool
25where
26    Connection: AsyncConnection + 'static,
27    DieselManager<Connection>: DeadpoolManager,
28    for<'pool> Object<DieselManager<Connection>>: DerefMut<Target = Connection>,
29    DeadpoolPoolError<<DieselManager<Connection> as DeadpoolManager>::Error>:
30        Into<DeadpoolPoolError<DieselPoolError>>,
31{
32    type PooledConnection<'pool> = Object<DieselManager<Connection>>;
33
34    type Builder = PoolBuilder<DieselManager<Connection>>;
35    type Pool = Pool<DieselManager<Connection>>;
36
37    type BuildError = BuildError;
38    type PoolError = DeadpoolPoolError<DieselPoolError>;
39
40    async fn build_pool(
41        builder: Self::Builder,
42        _: DieselManager<Connection>,
43    ) -> Result<Self::Pool, Self::BuildError> {
44        builder.build()
45    }
46
47    async fn get_connection<'pool>(
48        pool: &'pool Self::Pool,
49    ) -> Result<Self::PooledConnection<'pool>, Self::PoolError> {
50        pool.get().await.map_err(Into::into)
51    }
52}
53
54impl From<BuildError>
55    for BackendError<BuildError, DeadpoolPoolError<DieselPoolError>, ConnectionError, DieselError>
56{
57    fn from(value: BuildError) -> Self {
58        Self::Build(value)
59    }
60}
61
62impl From<DeadpoolPoolError<DieselPoolError>>
63    for BackendError<BuildError, DeadpoolPoolError<DieselPoolError>, ConnectionError, DieselError>
64{
65    fn from(value: DeadpoolPoolError<DieselPoolError>) -> Self {
66        Self::Pool(value)
67    }
68}