use std::error::Error;
use std::iter::Enumerate;
use std::slice::Iter;
use tokio::sync::mpsc::error::SendError;
use tokio::sync::mpsc::Sender;
use crate::context::BarEvent;
#[derive(Debug, Clone)]
pub struct Dispatcher {
inner: Vec<Sender<BarEvent>>,
}
impl Dispatcher {
pub fn new(inner: Vec<Sender<BarEvent>>) -> Dispatcher {
Dispatcher { inner }
}
pub fn enumerate(&self) -> Enumerate<Iter<Sender<BarEvent>>> {
self.inner.iter().enumerate()
}
pub async fn send_bar_event(&self, idx: usize, ev: BarEvent) -> Result<(), Box<dyn Error>> {
match self.inner.get(idx) {
Some(tx) => {
if tx.capacity() == 0 {
return Err(format!(
"failed to send event to item[{}]: dropping event (channel is full)",
idx
)
.into());
}
if let Err(SendError(_)) = tx.send(ev).await {
return Err(format!(
"failed to send event to item[{}]: dropping event (receiver dropped)",
idx
)
.into());
}
Ok(())
}
None => Err(format!("no item found with index: {}", idx).into()),
}
}
}