use std::sync::Arc;
use diesel_async::{pooled_connection::{deadpool::Pool, AsyncDieselConnectionManager}, AsyncPgConnection};
use log::{error, info};
use thiserror::Error;
use diesel::result::Error as DieselError;
use deadpool::managed::Object;
pub type DbPool = Arc<Pool<diesel_async::AsyncPgConnection>>;
#[derive(Error, Debug)]
pub enum DatabaseError {
#[error("Error al construir el pool de conexiones: {0}")]
PoolCreationError(String),
}
pub async fn async_connection(database_url: &str) -> Result<DbPool, DatabaseError> {
let config =
AsyncDieselConnectionManager::<diesel_async::AsyncPgConnection>::new(database_url);
match Pool::builder(config).max_size(16).build() {
Ok(pool) => {
info!("Conexión al pool de base de datos exitosa."); Ok(Arc::new(pool))
}
Err(e) => {
error!("Error al conectar al pool de base de datos: {}", e); Err(DatabaseError::PoolCreationError(e.to_string()))
}
}
}
pub async fn get_connection(
pool: DbPool,
) -> Result<Object<AsyncDieselConnectionManager<AsyncPgConnection>>, DieselError> {
pool.get()
.await
.map_err(|_| DieselError::NotFound) }