use rawsql::Loader;
use sqlx::{Executor, IntoArguments, Pool};
use crate::{DbError, error::DbResult};
pub(crate) trait SqlDatabase<DB>
where
DB: sqlx::Database,
for<'z> &'z mut DB::Connection: Executor<'z, Database = DB>,
for<'z> DB::Arguments<'z>: IntoArguments<'z, DB>,
{
fn get_pool(&self) -> &Pool<DB>;
fn get_loader(&self) -> &Loader;
#[expect(dead_code)]
fn binder(&self, param_number: usize) -> String {
if std::any::type_name::<DB>() == "sqlx::mysql::MySql" {
return "?".to_owned();
}
format!("${param_number}")
}
fn get_query<'a>(&'a self, name: &'a str) -> DbResult<&'a str> {
get_query(self.get_loader(), name)
}
}
pub(super) fn get_query<'a>(loader: &'a Loader, name: &'a str) -> DbResult<&'a str> {
loader
.get(name)
.map(String::as_str)
.ok_or_else(|| DbError::DatabaseError(format!("{name} SQL query can't be found")))
}