event_driven_core/
repository.rs

1use crate::prelude::{Aggregate, BaseError, Executor, Message};
2
3use async_trait::async_trait;
4use std::{collections::VecDeque, sync::Arc};
5use tokio::sync::RwLock;
6
7#[async_trait]
8pub trait TRepository<E: Executor, A: Aggregate>: REventManager<A> + Sync + Send {
9	fn new(executor: Arc<RwLock<E>>) -> Self;
10	async fn get(&self, aggregate_id: &str) -> Result<A, BaseError>;
11	async fn update(&mut self, aggregate: &mut A) -> Result<(), BaseError>;
12	async fn add(&mut self, aggregate: &mut A) -> Result<String, BaseError>;
13	async fn delete(&self, _aggregate_id: &str) -> Result<(), BaseError>;
14}
15
16pub trait REventManager<A: Aggregate> {
17	fn get_events(&mut self) -> VecDeque<Box<dyn Message>>;
18	fn set_events(&mut self, events: VecDeque<Box<dyn Message>>);
19	fn event_hook(&mut self, aggregate: &mut A) {
20		self.set_events(aggregate.take_events());
21	}
22}
23
24// To Support Bulk Insert Operation
25#[macro_export]
26macro_rules! prepare_bulk_insert {
27    (
28        $subject:expr, $($field:ident:$field_type:ty),*
29    ) => {
30        $(
31            let mut $field:Vec<$field_type> = Vec::with_capacity($subject.len());
32        )*
33
34        $subject.iter().for_each(|subj|{
35            $(
36                $field.push(subj.$field.clone());
37            )*
38        }
39        )
40
41    };
42    (
43        $subject:expr, $($field:ident():$field_type:ty),*
44    ) =>{
45        $(
46            let mut $field:Vec<$field_type> = Vec::with_capacity($subject.len());
47        )*
48
49        $subject.iter().for_each(|subj|{
50            $(
51                $field.push(subj.$field().to_owned());
52            )*
53        }
54        )
55    }
56}