cqrs_eventsourcing/
query_processor.rs

1use 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}