use std::{collections::HashMap, sync::Arc};
use async_trait::async_trait;
#[cfg(feature = "arrow")]
use fraiseql_arrow::db::{ArrowDatabaseAdapter, DatabaseError};
#[cfg(feature = "wire-backend")]
use fraiseql_core::db::FraiseWireAdapter;
#[cfg(not(feature = "wire-backend"))]
use fraiseql_core::db::postgres::PostgresAdapter;
use fraiseql_core::db::traits::DatabaseAdapter as CoreDatabaseAdapter;
#[cfg(not(feature = "wire-backend"))]
pub struct FlightDatabaseAdapter {
inner: Arc<PostgresAdapter>,
}
#[cfg(feature = "wire-backend")]
pub struct FlightDatabaseAdapter {
inner: Arc<FraiseWireAdapter>,
}
#[cfg(not(feature = "wire-backend"))]
impl FlightDatabaseAdapter {
pub fn new(adapter: PostgresAdapter) -> Self {
Self {
inner: Arc::new(adapter),
}
}
pub fn from_arc(adapter: Arc<PostgresAdapter>) -> Self {
Self { inner: adapter }
}
pub fn inner(&self) -> &Arc<PostgresAdapter> {
&self.inner
}
}
#[cfg(feature = "wire-backend")]
impl FlightDatabaseAdapter {
pub fn new(adapter: FraiseWireAdapter) -> Self {
Self {
inner: Arc::new(adapter),
}
}
pub const fn from_arc(adapter: Arc<FraiseWireAdapter>) -> Self {
Self { inner: adapter }
}
pub const fn inner(&self) -> &Arc<FraiseWireAdapter> {
&self.inner
}
}
#[cfg(all(feature = "arrow", not(feature = "wire-backend")))]
#[async_trait]
impl ArrowDatabaseAdapter for FlightDatabaseAdapter {
async fn execute_raw_query(
&self,
sql: &str,
) -> Result<Vec<HashMap<String, serde_json::Value>>, DatabaseError> {
self.inner
.execute_raw_query(sql)
.await
.map_err(|e: fraiseql_core::error::FraiseQLError| DatabaseError::new(e.to_string()))
}
}
#[cfg(all(feature = "arrow", feature = "wire-backend"))]
#[async_trait]
impl ArrowDatabaseAdapter for FlightDatabaseAdapter {
async fn execute_raw_query(
&self,
sql: &str,
) -> Result<Vec<HashMap<String, serde_json::Value>>, DatabaseError> {
self.inner
.execute_raw_query(sql)
.await
.map_err(|e: fraiseql_core::error::FraiseQLError| DatabaseError::new(e.to_string()))
}
}
#[cfg(test)]
mod tests {
#![allow(clippy::unwrap_used)]
use super::*;
#[test]
fn test_adapter_creation() {
let _adapter: FlightDatabaseAdapter;
}
}