use crate::{Meta, MetaKey, Service, ServiceKey, ServiceStatus};
#[derive(Clone, Debug)]
pub enum ServiceEvent {
Changed(Service),
Deleted(ServiceKey),
}
#[derive(Clone, Debug)]
pub enum MetaEvent {
Changed(Meta),
Deleted(MetaKey),
}
pub struct WatchRx<T> {
receiver: tokio::sync::mpsc::UnboundedReceiver<T>,
}
impl<T> WatchRx<T> {
pub async fn recv(&mut self) -> Option<T> {
self.receiver.recv().await
}
}
pub struct WatchTx<T> {
sender: tokio::sync::mpsc::UnboundedSender<T>,
}
impl<T> WatchTx<T> {
pub fn send(&self, event: T) -> Result<(), T> {
self.sender.send(event).map_err(|e| e.0)
}
}
pub fn build_watch<T>() -> (WatchTx<T>, WatchRx<T>) {
let (sender, receiver) = tokio::sync::mpsc::unbounded_channel();
(WatchTx { sender }, WatchRx { receiver })
}
#[derive(Clone, Debug)]
pub struct OneselfRx {
receiver: tokio::sync::watch::Receiver<ServiceStatus>,
}
impl OneselfRx {
pub async fn changed(&mut self) -> Result<ServiceStatus, ()> {
let _ = self.receiver.changed().await.map_err(|_| ())?;
let status = *self.receiver.borrow();
Ok(status)
}
pub fn status(&self) -> ServiceStatus {
*self.receiver.borrow()
}
}
#[derive(Clone)]
pub struct OneselfTx {
sender: tokio::sync::watch::Sender<ServiceStatus>,
receiver: tokio::sync::watch::Receiver<ServiceStatus>,
}
impl OneselfTx {
pub fn send(&self, status: ServiceStatus) -> Result<(), ServiceStatus> {
self.sender.send(status).map_err(|e| e.0)
}
pub fn oneself_rx(&self) -> OneselfRx {
OneselfRx {
receiver: self.receiver.clone(),
}
}
pub fn count(&self) -> usize {
self.sender.sender_count()
}
}
pub fn build_oneself(status: ServiceStatus) -> (OneselfTx, OneselfRx) {
let (sender, receiver) = tokio::sync::watch::channel(status);
(
OneselfTx {
sender,
receiver: receiver.clone(),
},
OneselfRx { receiver },
)
}