esrs 0.18.0

A Prima.it-opinionated library to achieve cqrs/es
Documentation
use sqlx::{Database, Postgres};

use crate::Aggregate;

pub trait StatementsHandler<D>
where
    D: Database,
{
    fn new<A>() -> Self
    where
        A: Aggregate;
    fn table_name(&self) -> &str;
    fn by_aggregate_id(&self) -> &str;
    fn select_all(&self) -> &str;
    fn insert(&self) -> &str;
    fn delete_by_aggregate_id(&self) -> &str;
}

#[derive(Clone, Debug)]
pub struct Statements {
    table_name: String,
    select_by_aggregate_id: String,
    select_all: String,
    insert: String,
    delete_by_aggregate_id: String,
}

impl StatementsHandler<Postgres> for Statements {
    fn new<A>() -> Self
    where
        A: Aggregate,
    {
        let table_name: String = format!("{}_events", A::NAME);

        Self {
            table_name: table_name.clone(),
            select_by_aggregate_id: format!(
                include_str!("postgres/statements/select_by_aggregate_id.sql"),
                table_name
            ),
            select_all: format!(include_str!("postgres/statements/select_all.sql"), table_name),
            insert: format!(include_str!("postgres/statements/insert.sql"), table_name),
            delete_by_aggregate_id: format!(
                include_str!("postgres/statements/delete_by_aggregate_id.sql"),
                table_name
            ),
        }
    }

    fn table_name(&self) -> &str {
        &self.table_name
    }

    fn by_aggregate_id(&self) -> &str {
        &self.select_by_aggregate_id
    }

    fn select_all(&self) -> &str {
        &self.select_all
    }

    fn insert(&self) -> &str {
        &self.insert
    }

    fn delete_by_aggregate_id(&self) -> &str {
        &self.delete_by_aggregate_id
    }
}