kabu_core_actors/channels/broadcaster.rs
1use eyre::Result;
2use tokio::sync::broadcast;
3use tokio::sync::broadcast::error::SendError;
4use tokio::sync::broadcast::Receiver;
5
6#[derive(Clone)]
7pub struct Broadcaster<T>
8where
9 T: Clone + Send + Sync + 'static,
10{
11 sender: broadcast::Sender<T>,
12}
13
14impl<T: Clone + Send + Sync + 'static> Broadcaster<T> {
15 pub fn new(capacity: usize) -> Self {
16 let (sender, _) = broadcast::channel(capacity);
17 Self { sender }
18 }
19
20 pub fn send(&self, value: T) -> Result<usize, SendError<T>> {
21 self.sender.send(value)
22 }
23
24 /*
25 pub fn try_send(&self, value: T) -> Result<usize> {
26 //let sender = self.sender.write().await;
27 match self.sender.try_write() {
28 Ok(guard) => match guard.send(value) {
29 Ok(size) => Ok(size),
30 Err(_) => Err(eyre!("ERROR_SEND")),
31 },
32 Err(e) => {
33 error!("self.sender.try_write {}", e);
34 Err(eyre!("ERROR_WRITE_LOCK"))
35 }
36 }
37 }
38 */
39
40 pub fn subscribe(&self) -> Receiver<T> {
41 self.sender.subscribe()
42 }
43}