1use crate::Aggregate;
2use chrono::{DateTime, Utc};
3use serde::de::DeserializeOwned;
4use serde::{Deserialize, Serialize};
5use std::collections::HashMap;
6use std::fmt::Debug;
7
8pub trait Event: Debug + Serialize + DeserializeOwned + Clone + PartialEq + Sync + Send {
9 fn event_type(&self) -> String;
10}
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
13#[serde(rename_all = "camelCase")]
14pub struct EventEnvelope<A>
15where
16 A: Aggregate,
17{
18 #[serde(rename = "_id")]
19 pub event_id: String,
20 pub aggregate_id: String,
22 pub version: usize,
24 pub payload: A::Event,
26 pub metadata: HashMap<String, String>,
28 pub at: DateTime<Utc>,
30}