use serde::{Deserialize, Serialize};
use sqlx::postgres::{PgPool, PgPoolOptions};
use sqlx::sqlite::{SqlitePool, SqlitePoolOptions};
use crate::error::{Error, Result};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum SqlDriver {
#[default]
Sqlite,
Postgres,
}
#[derive(Debug)]
pub(crate) enum SqlPool {
Sqlite(SqlitePool),
Postgres(PgPool),
}
impl SqlPool {
pub(crate) async fn connect(driver: SqlDriver, connection: &str) -> Result<Self> {
match driver {
SqlDriver::Sqlite => {
let connection_url = if connection == ":memory:" {
"sqlite::memory:".to_string()
} else {
format!("sqlite:{}", connection)
};
let pool = SqlitePoolOptions::new()
.max_connections(1)
.connect(&connection_url)
.await
.map_err(|e| Error::config(format!("Failed to connect to sqlite: {}", e)))?;
Ok(SqlPool::Sqlite(pool))
}
SqlDriver::Postgres => {
let pool = PgPoolOptions::new()
.max_connections(5)
.connect(connection)
.await
.map_err(|e| Error::config(format!("Failed to connect to postgres: {}", e)))?;
Ok(SqlPool::Postgres(pool))
}
}
}
}