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}