use serde::{Deserialize, Serialize};
pub type EventVersion = u64;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct StreamEventEnvelope<T> {
pub version: EventVersion,
pub payload: T,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DeliveredEvent {
pub request_id: String,
pub version: EventVersion,
pub payload: Vec<u8>,
}
impl DeliveredEvent {
pub fn from_stream_event(request_id: impl Into<String>, event: &StreamEvent) -> Self {
Self {
request_id: request_id.into(),
version: event.version,
payload: event.payload.clone(),
}
}
pub fn payload_json<T: for<'de> Deserialize<'de>>(&self) -> crate::Result<T> {
serde_json::from_slice(&self.payload)
.map_err(|e| crate::Error::Serialization(e.to_string()))
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct StreamEvent {
pub namespace: String,
pub version: EventVersion,
pub payload: Vec<u8>,
pub filter_value: Option<String>,
}
impl StreamEvent {
pub fn envelope<T: for<'de> Deserialize<'de>>(
&self,
) -> crate::Result<StreamEventEnvelope<T>> {
let payload = serde_json::from_slice(&self.payload)
.map_err(|e| crate::Error::Serialization(e.to_string()))?;
Ok(StreamEventEnvelope {
version: self.version,
payload,
})
}
}
pub trait EventCodec: Send + Sync {
type Event: Serialize + for<'de> Deserialize<'de> + Send + Sync;
fn encode(&self, event: &Self::Event) -> crate::Result<Vec<u8>> {
serde_json::to_vec(event).map_err(|e| crate::Error::Serialization(e.to_string()))
}
fn decode(&self, bytes: &[u8]) -> crate::Result<Self::Event> {
serde_json::from_slice(bytes).map_err(|e| crate::Error::Serialization(e.to_string()))
}
}