use chrono::{DateTime, Utc};
pub trait DomainEvent: Clone + Send + Sync + 'static {
fn event_type(&self) -> &'static str;
fn aggregate_id(&self) -> &str;
fn occurred_at(&self) -> DateTime<Utc> {
Utc::now()
}
fn aggregate_type(&self) -> &'static str {
let event_type = self.event_type();
for suffix in ["Created", "Updated", "Deleted", "Changed", "Added", "Removed"] {
if event_type.ends_with(suffix) {
return event_type;
}
}
event_type
}
fn version(&self) -> u32 {
1
}
}
#[allow(dead_code)]
pub trait SerializableEvent: DomainEvent + serde::Serialize + serde::de::DeserializeOwned {}
impl<T> SerializableEvent for T where T: DomainEvent + serde::Serialize + serde::de::DeserializeOwned {}