event_driven_core/
repository.rs1use 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#[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}