use bytes::Bytes;
use intrepid_core::{Frame, MessageFrame};
use uuid::Uuid;
use super::{Event, EventKind, IntoEvent};
#[derive(Clone, Debug, Default)]
pub struct EventRecord {
pub stream_name: String,
pub id: Uuid,
pub kind: EventKind,
pub data: Bytes,
pub meta: Bytes,
pub position: i64,
}
impl EventRecord {
pub fn new(
stream_name: impl AsRef<str>,
kind: EventKind,
data: impl Into<Bytes>,
meta: impl Into<Bytes>,
position: impl Into<i64>,
) -> Self {
Self {
stream_name: stream_name.as_ref().to_owned(),
id: Uuid::new_v4(),
kind,
data: data.into(),
meta: meta.into(),
position: position.into(),
}
}
pub fn entry(
stream_name: impl AsRef<str>,
data: impl Into<Bytes>,
meta: impl Into<Bytes>,
position: impl Into<i64>,
) -> Self {
Self::new(stream_name, EventKind::Entry, data, meta, position)
}
pub fn marker(
stream_name: impl AsRef<str>,
data: impl Into<Bytes>,
meta: impl Into<Bytes>,
position: impl Into<i64>,
) -> Self {
Self::new(stream_name, EventKind::Marker, data, meta, position)
}
pub fn set_position(mut self, position: impl Into<i64>) -> Self {
self.position = position.into();
self
}
}
impl IntoEvent for EventRecord {
fn into_event(self) -> Event {
Event::new(self.stream_name, self.kind, self.data)
}
}
impl From<EventRecord> for Frame {
fn from(record: EventRecord) -> Self {
Self::Message(MessageFrame {
uri: record.stream_name,
data: record.data,
meta: record.meta,
})
}
}
impl From<Event> for EventRecord {
fn from(event: Event) -> Self {
Self::new(event.stream_name, event.kind, event.data, Bytes::new(), 0)
}
}
#[test]
fn creating_event_records() {
let record = EventRecord::entry("stream-name", "arbitrary data", "", 1);
assert_ne!(record.id, Uuid::nil());
assert_eq!(record.stream_name, "stream-name");
assert_eq!(record.kind, EventKind::Entry);
assert_eq!(record.data, Bytes::from("arbitrary data"));
assert_eq!(record.meta, Bytes::new());
assert_eq!(record.position, 1);
let record = EventRecord::marker("stream-name", "arbitrary data", "", 1);
assert_ne!(record.id, Uuid::nil());
assert_eq!(record.stream_name, "stream-name");
assert_eq!(record.kind, EventKind::Marker);
assert_eq!(record.data, Bytes::from("arbitrary data"));
assert_eq!(record.meta, Bytes::new());
assert_eq!(record.position, 1);
let record = EventRecord::new("stream-name", EventKind::Entry, "arbitrary data", "", 1);
assert_ne!(record.id, Uuid::nil());
assert_eq!(record.stream_name, "stream-name");
assert_eq!(record.kind, EventKind::Entry);
assert_eq!(record.data, Bytes::from("arbitrary data"));
assert_eq!(record.meta, Bytes::new());
assert_eq!(record.position, 1);
}
#[test]
fn event_record_into_event() {
let record = EventRecord {
stream_name: "stream-name".into(),
id: Uuid::new_v4(),
kind: EventKind::Entry,
data: Bytes::from("arbitrary data"),
meta: Bytes::from("arbitrary meta"),
position: 1,
};
let event = record.clone().into_event();
assert_eq!(event.stream_name, record.stream_name);
assert_eq!(event.kind, record.kind);
assert_eq!(event.data, record.data);
}