1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use std::marker::PhantomData;

use crate::{Aggregate, DomainEvent, Error, Query, Store};

pub struct QueryProcessor<A, E, Q>
where
    A: Aggregate,
    E: DomainEvent<A>,
    Q: Query<A, E>,
{
    _a: PhantomData<A>,
    _e: PhantomData<E>,
    _q: PhantomData<Q>,
}

impl<A, E, Q> QueryProcessor<A, E, Q>
where
    A: Aggregate,
    E: DomainEvent<A>,
    Q: Query<A, E>,
{
    pub async fn process<S: Store<A, E>>(
        store: &S,
        aggregate_id: Option<&str>,
    ) -> Result<Q, Error> {
        let mut query = Q::default();
        let events = store.retrieve_for_query(aggregate_id).await?;

        for event in events {
            query.populate(&event);
        }

        Ok(query)
    }
}