use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize, de::DeserializeOwned};
use uuid::Uuid;
pub trait EventData: Serialize + DeserializeOwned + Send + Sync + 'static {
fn event_type(&self) -> &'static str;
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct EventMetadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub correlation_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub causation_id: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none")]
pub actor: Option<String>,
}
#[derive(Debug, Clone)]
pub struct Event<E: EventData> {
pub event: E,
pub metadata: serde_json::Value,
}
impl<E: EventData> Event<E> {
pub fn new(event: E) -> Self {
Self {
event,
metadata: serde_json::json!({}),
}
}
pub fn with_metadata(mut self, metadata: serde_json::Value) -> Self {
self.metadata = metadata;
self
}
}
#[derive(Debug, Clone)]
pub struct RecordedEvent {
pub global_position: i64,
pub stream_id: String,
pub stream_version: i64,
pub event_type: String,
pub data: serde_json::Value,
pub metadata: serde_json::Value,
pub transaction_id: u64,
pub created_at: DateTime<Utc>,
}