use std::collections::HashMap;
use crate::{Query, QueryBuilder, QueryBuilderTrait, TableBuilder, Value};
#[cfg(feature = "libsql")]
pub mod libsql;
#[cfg(feature = "rusqlite")]
pub mod rusqlite;
pub trait GeekConnector
where
Self: Sized + TableBuilder + QueryBuilderTrait + serde::Serialize + serde::de::DeserializeOwned,
{
#[allow(async_fn_in_trait, unused_variables)]
async fn query<'a, T>(
connection: impl Into<&'a T>,
query: Query,
) -> Result<Vec<Self>, crate::Error>
where
T: GeekConnection<Connection = T> + 'a,
{
Ok(T::query::<Self>(connection.into(), query).await?)
}
#[allow(async_fn_in_trait, unused_variables)]
async fn query_first<'a, T>(
connection: impl Into<&'a T>,
query: Query,
) -> Result<Self, crate::Error>
where
T: GeekConnection<Connection = T> + 'a,
{
Ok(T::query_first::<Self>(connection.into(), query).await?)
}
#[allow(async_fn_in_trait, unused_variables)]
async fn execute<'a, T>(connection: impl Into<&'a T>, query: Query) -> Result<(), crate::Error>
where
T: GeekConnection<Connection = T> + 'a,
{
Ok(T::execute::<Self>(connection.into(), query).await?)
}
#[allow(async_fn_in_trait, unused_variables)]
async fn create_table<'a, T>(connection: impl Into<&'a T>) -> Result<(), crate::Error>
where
T: GeekConnection<Connection = T> + 'a,
Self: serde::Serialize,
{
Ok(T::create_table::<Self>(connection.into()).await?)
}
#[allow(async_fn_in_trait, unused_variables)]
async fn row_count<'a, T>(
connection: impl Into<&'a T>,
query: Query,
) -> Result<i64, crate::Error>
where
T: GeekConnection<Connection = T> + 'a,
{
Ok(T::row_count(connection.into(), query).await?)
}
#[allow(async_fn_in_trait, unused_variables)]
async fn update<'a, T>(&self, connection: impl Into<&'a T>) -> Result<(), crate::Error>
where
T: GeekConnection<Connection = T> + 'a,
{
Self::execute(connection, Self::query_update(self)).await
}
#[allow(async_fn_in_trait, unused_variables)]
async fn save<'a, T>(&mut self, connection: impl Into<&'a T>) -> Result<(), crate::Error>
where
T: GeekConnection<Connection = T> + 'a;
#[allow(async_fn_in_trait, unused_variables)]
async fn delete<'a, T>(&self, connection: impl Into<&'a T>) -> Result<(), crate::Error>
where
T: GeekConnection + 'a,
{
Err(crate::Error::NotImplemented)
}
#[allow(async_fn_in_trait, unused_variables)]
async fn fetch<'a, T>(&mut self, connection: impl Into<&'a T>) -> Result<(), crate::Error>
where
T: GeekConnection<Connection = T> + 'a;
#[allow(async_fn_in_trait, unused_variables)]
async fn fetch_all<'a, T>(connection: impl Into<&'a T>) -> Result<Vec<Self>, crate::Error>
where
T: GeekConnection<Connection = T> + 'a,
{
Ok(T::query::<Self>(
connection.into(),
QueryBuilder::select().table(Self::table()).build()?,
)
.await?)
}
}
pub trait GeekConnection {
type Row;
type Rows;
type Connection;
type Statement;
#[allow(async_fn_in_trait, unused_variables)]
async fn create_table<T>(connection: &Self::Connection) -> Result<(), crate::Error>
where
T: TableBuilder
+ QueryBuilderTrait
+ Sized
+ serde::Serialize
+ serde::de::DeserializeOwned,
{
Err(crate::Error::NotImplemented)
}
#[allow(async_fn_in_trait, unused_variables)]
async fn row_count(connection: &Self::Connection, query: Query) -> Result<i64, crate::Error> {
Err(crate::Error::NotImplemented)
}
#[allow(async_fn_in_trait, unused_variables)]
async fn execute<T>(connection: &Self::Connection, query: Query) -> Result<(), crate::Error>
where
T: serde::de::DeserializeOwned,
{
Err(crate::Error::NotImplemented)
}
#[allow(async_fn_in_trait, unused_variables)]
async fn query<T>(connection: &Self::Connection, query: Query) -> Result<Vec<T>, crate::Error>
where
T: serde::de::DeserializeOwned,
{
Err(crate::Error::NotImplemented)
}
#[allow(async_fn_in_trait, unused_variables)]
async fn query_first<T>(connection: &Self::Connection, query: Query) -> Result<T, crate::Error>
where
T: serde::de::DeserializeOwned,
{
Err(crate::Error::NotImplemented)
}
#[allow(async_fn_in_trait, unused_variables)]
async fn query_raw(
connection: &Self::Connection,
query: Query,
) -> Result<Vec<HashMap<String, Value>>, crate::Error> {
Err(crate::Error::NotImplemented)
}
}