hyperlane_broadcast/broadcast_map/
impl.rs

1use crate::*;
2
3impl<T: Clone + Debug> BroadcastMapTrait for T {}
4
5impl<'a, T: BroadcastMapTrait> Default for BroadcastMap<'a, T> {
6    fn default() -> Self {
7        BroadcastMap {
8            capacity: DashMap::new(),
9            sender: DashMap::new(),
10        }
11    }
12}
13
14impl<'a, T: BroadcastMapTrait> BroadcastMap<'a, T> {
15    pub fn new(key: &'a str, capacity: usize) -> Self {
16        let sender: BroadcastSender<T> = BroadcastSender::new(capacity);
17        let broadcast: BroadcastMap<T> = BroadcastMap::default();
18        let sender_map: &DashMap<&str, Sender<T>> = broadcast.get_sender();
19        let capacity_map: &DashMap<&str, usize> = broadcast.get_capacity();
20        sender_map.insert(key, sender);
21        capacity_map.insert(key, capacity);
22        broadcast
23    }
24
25    pub fn receiver_count(&self, key: &'a str) -> OptionReceiverCount {
26        self.get_sender()
27            .get(key)
28            .map(|receiver| receiver.receiver_count())
29    }
30
31    pub fn subscribe(&self, key: &'a str) -> OptionBroadcastMapReceiver<T> {
32        self.get_sender()
33            .get(key)
34            .map(|receiver| receiver.subscribe())
35    }
36
37    pub fn send(&self, key: &'a str, data: T) -> BroadcastMapSendResult<T> {
38        match self.get_sender().get(key) {
39            Some(sender) => sender.send(data).map(|result| Some(result)),
40            None => Ok(None),
41        }
42    }
43}