db_pool/async/backend/common/pool/diesel/
deadpool.rs1use 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
20pub 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}