event_sourcing/
event_list_builder.rs

1use alloc::string::{String, ToString};
2use alloc::vec;
3use alloc::vec::Vec;
4use core::fmt;
5
6use chrono::{DateTime, Utc};
7use uuid::Uuid;
8
9use super::{Aggregate, Event};
10
11/// A utility for creating a sequence of events
12#[derive(Debug)]
13pub struct EventListBuilder<E> {
14    list: Vec<(E, Option<DateTime<Utc>>)>,
15    user_id: Option<String>,
16}
17
18impl<E: fmt::Debug> EventListBuilder<E> {
19    pub fn new() -> Self {
20        Self {
21            list: vec![],
22            user_id: None,
23        }
24    }
25
26    pub fn add_event(mut self, payload: E, created_at: Option<DateTime<Utc>>) -> Self {
27        self.list.push((payload, created_at));
28        self
29    }
30
31    pub fn user_id(mut self, user_id: &str) -> Self {
32        self.user_id = Some(user_id.to_string());
33        self
34    }
35
36    pub fn build<A: Aggregate<E> + fmt::Debug>(self, aggregate: &A) -> Vec<Event<E>> {
37        let mut offset = 0;
38        self.list
39            .into_iter()
40            .map(|(payload, created_at)| {
41                let event = Event {
42                    aggregate_id: aggregate.aggregate_id(),
43                    event_id: aggregate.version() + 1 + offset,
44                    created_at: created_at.unwrap_or_else(|| Utc::now()),
45                    user_id: self.user_id.clone(),
46                    payload,
47                };
48                offset += 1;
49                event
50            })
51            .collect()
52    }
53
54    pub fn build_new(self, aggregate_id: Uuid) -> Vec<Event<E>> {
55        let mut offset = 0;
56        self.list
57            .into_iter()
58            .map(|(payload, created_at)| {
59                let event = Event {
60                    aggregate_id,
61                    event_id: 1 + offset,
62                    created_at: created_at.unwrap_or_else(|| Utc::now()),
63                    user_id: self.user_id.clone(),
64                    payload,
65                };
66                offset += 1;
67                event
68            })
69            .collect()
70    }
71}