wsb 0.183.4039

Workspace - A tool suite for file operations, version management, and development workflow automation
Documentation
use crate::prelude::*;
use r2d2::PooledConnection;
use r2d2_sqlite::SqliteConnectionManager;
use rusqlite::Row;

pub trait Repository<T: Clone> {
    fn get_connection(&self) -> Result<r2d2::PooledConnection<SqliteConnectionManager>>;
    fn map_row(row: &Row) -> Result<T>;

    fn create_impl(&self, entity: &T, conn: &PooledConnection<SqliteConnectionManager>) -> Result<()>;
    fn find_by_id_impl(&self, id: &str, conn: &PooledConnection<SqliteConnectionManager>) -> Result<Option<T>>;
    fn update_impl(&self, entity: &T, conn: &PooledConnection<SqliteConnectionManager>) -> Result<()>;
    fn upsert_impl(&self, entity: &T, conn: &PooledConnection<SqliteConnectionManager>) -> Result<()>;
    fn delete_impl(&self, id: &str, conn: &PooledConnection<SqliteConnectionManager>) -> Result<()>;
    fn list_impl(&self, conn: &PooledConnection<SqliteConnectionManager>, offset: Option<i64>, limit: Option<i64>) -> Result<Vec<T>>;
    fn count_impl(&self, conn: &PooledConnection<SqliteConnectionManager>) -> Result<i64>;

    async fn create(&self, entity: &T) -> Result<()> {
        let conn = self.get_connection()?;
        self.create_impl(entity, &conn)
    }

    async fn find_by_id(&self, id: &str) -> Result<Option<T>> {
        let conn = self.get_connection()?;
        self.find_by_id_impl(id, &conn)
    }

    async fn update(&self, entity: &T) -> Result<()> {
        let conn = self.get_connection()?;
        self.update_impl(entity, &conn)
    }

    async fn upsert(&self, entity: &T) -> Result<()> {
        let conn = self.get_connection()?;
        self.upsert_impl(entity, &conn)
    }

    async fn delete(&self, id: &str) -> Result<()> {
        let conn = self.get_connection()?;
        self.delete_impl(id, &conn)
    }

    async fn list(&self, offset: Option<i64>, limit: Option<i64>) -> Result<Vec<T>> {
        let conn = self.get_connection()?;
        self.list_impl(&conn, offset, limit)
    }

    async fn count(&self) -> Result<i64> {
        let conn = self.get_connection()?;
        self.count_impl(&conn)
    }
}