cqrs_eventsourcing/
query_processor.rs1use std::marker::PhantomData;
2
3use crate::{Aggregate, DomainEvent, Error, Query, Store};
4
5pub struct QueryProcessor<A, E, Q>
6where
7 A: Aggregate,
8 E: DomainEvent<A>,
9 Q: Query<A, E>,
10{
11 _a: PhantomData<A>,
12 _e: PhantomData<E>,
13 _q: PhantomData<Q>,
14}
15
16impl<A, E, Q> QueryProcessor<A, E, Q>
17where
18 A: Aggregate,
19 E: DomainEvent<A>,
20 Q: Query<A, E>,
21{
22 pub async fn process<S: Store<A, E>>(
23 store: &S,
24 aggregate_id: Option<&str>,
25 ) -> Result<Q, Error> {
26 let mut query = Q::default();
27 let events = store.retrieve_for_query(aggregate_id).await?;
28
29 for event in events {
30 query.populate(&event);
31 }
32
33 Ok(query)
34 }
35}