use bytes::Bytes;
use helix_core::effect::DomainEventBytes;
use helix_core::Effect;
use serde::Serialize;
use serde_json::Value;
pub mod announcement;
pub mod channel;
pub mod channel_member;
pub(crate) mod channel_sync;
pub mod post;
pub mod read;
pub mod schedule;
pub mod sync;
pub mod timeline;
#[derive(Debug, Clone)]
pub struct MessageV3Event {
bytes: DomainEventBytes,
}
#[derive(Serialize)]
struct MessageV3Envelope {
event: &'static str,
data: Value,
}
impl MessageV3Event {
pub fn new(event: &'static str, data: Value) -> Result<Self, crate::ImError> {
if !data.is_object() {
return Err(crate::ImError::Parse(format!(
"{event} MessageV3 data must be an object"
)));
}
let bytes = serde_json::to_vec(&MessageV3Envelope { event, data })
.map_err(|error| crate::ImError::Parse(error.to_string()))?;
Ok(Self {
bytes: DomainEventBytes(Bytes::from(bytes)),
})
}
pub fn into_effect(self) -> Effect {
Effect::Emit { event: self.bytes }
}
pub(crate) fn into_bytes(self) -> Vec<u8> {
self.bytes.0.to_vec()
}
}
pub(crate) fn encode(event: &'static str, data: Value) -> Result<MessageV3Event, crate::ImError> {
MessageV3Event::new(event, data)
}