use crate::broadcaster::Broadcaster;
use crate::Error;
use serde::Serialize;
use std::sync::Arc;
pub struct Broadcast {
broadcaster: Arc<Broadcaster>,
}
impl Broadcast {
pub fn new(broadcaster: Arc<Broadcaster>) -> Self {
Self { broadcaster }
}
pub fn channel(&self, name: impl Into<String>) -> BroadcastBuilder {
BroadcastBuilder {
broadcaster: self.broadcaster.clone(),
channel: name.into(),
event: None,
data: None,
except: None,
}
}
pub fn broadcaster(&self) -> &Arc<Broadcaster> {
&self.broadcaster
}
}
pub struct BroadcastBuilder {
broadcaster: Arc<Broadcaster>,
channel: String,
event: Option<String>,
data: Option<serde_json::Value>,
except: Option<String>,
}
impl BroadcastBuilder {
pub fn event(mut self, name: impl Into<String>) -> Self {
self.event = Some(name.into());
self
}
pub fn data<T: Serialize>(mut self, data: T) -> Self {
self.data = serde_json::to_value(data).ok();
self
}
pub fn except(mut self, socket_id: impl Into<String>) -> Self {
self.except = Some(socket_id.into());
self
}
pub async fn send(self) -> Result<(), Error> {
let event = self.event.unwrap_or_else(|| "message".into());
let data = self.data.unwrap_or(serde_json::Value::Null);
if let Some(except) = self.except {
self.broadcaster
.broadcast_except(&self.channel, &event, data, &except)
.await
} else {
self.broadcaster
.broadcast(&self.channel, &event, data)
.await
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[tokio::test]
async fn test_broadcast_builder() {
let broadcaster = Arc::new(Broadcaster::new());
let broadcast = Broadcast::new(broadcaster);
let result = broadcast
.channel("orders.1")
.event("OrderUpdated")
.data(serde_json::json!({"id": 1}))
.send()
.await;
assert!(result.is_ok());
}
}