use serde::{Deserialize, Serialize};
use uuid::Uuid;
use jiff::Timestamp;
use crate::models::Event;
use crate::Result;
pub mod producer;
pub mod consumer;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "event_type")]
pub enum EventEvent {
Created {
event: Event,
timestamp: Timestamp,
},
Updated {
event: Event,
timestamp: Timestamp,
},
Deleted {
event_id: Uuid,
timestamp: Timestamp,
},
Merged {
source_id: Uuid,
target_id: Uuid,
timestamp: Timestamp,
},
Linked {
event_id: Uuid,
linked_id: Uuid,
timestamp: Timestamp,
},
Unlinked {
event_id: Uuid,
unlinked_id: Uuid,
timestamp: Timestamp,
},
}
impl EventEvent {
pub fn timestamp(&self) -> Timestamp {
match self {
EventEvent::Created { timestamp, .. } => *timestamp,
EventEvent::Updated { timestamp, .. } => *timestamp,
EventEvent::Deleted { timestamp, .. } => *timestamp,
EventEvent::Merged { timestamp, .. } => *timestamp,
EventEvent::Linked { timestamp, .. } => *timestamp,
EventEvent::Unlinked { timestamp, .. } => *timestamp,
}
}
pub fn event_id(&self) -> Uuid {
match self {
EventEvent::Created { event, .. } => event.id,
EventEvent::Updated { event, .. } => event.id,
EventEvent::Deleted { event_id, .. } => *event_id,
EventEvent::Merged { source_id, .. } => *source_id,
EventEvent::Linked { event_id, .. } => *event_id,
EventEvent::Unlinked { event_id, .. } => *event_id,
}
}
}
pub trait EventProducer: Send + Sync {
fn publish(&self, event: EventEvent) -> Result<()>;
}
pub use producer::InMemoryEventPublisher;
pub trait EventConsumer {
fn subscribe(&mut self) -> Result<()>;
fn next_event(&mut self) -> Result<Option<EventEvent>>;
}