event_sourcing/
event_list_builder.rs1use 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#[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}