hyperlane_broadcast/broadcast_map/
impl.rs

1use crate::*;
2
3impl<T: Clone + Debug> BroadcastMapTrait for T {}
4
5impl<T: BroadcastMapTrait> Default for BroadcastMap<T> {
6    fn default() -> Self {
7        BroadcastMap {
8            capacity: DashMap::new(),
9            sender: DashMap::new(),
10        }
11    }
12}
13
14impl<T: BroadcastMapTrait> BroadcastMap<T> {
15    pub fn new() -> Self {
16        Self::default()
17    }
18
19    pub fn insert<K>(&self, key: K, capacity: usize) -> Self
20    where
21        K: ToString,
22    {
23        let key_string: String = key.to_string();
24        let sender: BroadcastSender<T> = BroadcastSender::new(capacity);
25        let broadcast: BroadcastMap<T> = BroadcastMap::default();
26        broadcast.get_sender().insert(key_string.clone(), sender);
27        broadcast.get_capacity().insert(key_string, capacity);
28        broadcast
29    }
30
31    pub fn receiver_count(&self, key: &str) -> OptionReceiverCount {
32        self.get_sender()
33            .get(key)
34            .map(|receiver| receiver.receiver_count())
35    }
36
37    pub fn subscribe(&self, key: &str) -> OptionBroadcastMapReceiver<T> {
38        self.get_sender()
39            .get(key)
40            .map(|receiver| receiver.subscribe())
41    }
42
43    pub fn subscribe_unwrap_or_insert(&self, key: &str) -> BroadcastMapReceiver<T> {
44        match self.get_sender().get(key) {
45            Some(sender) => sender.subscribe(),
46            None => {
47                let new_sender: Sender<T> = BroadcastSender::new(DEFAULT_BROADCAST_SENDER_CAPACITY);
48                self.get_sender()
49                    .insert(key.to_string(), new_sender.clone());
50                self.get_capacity()
51                    .insert(key.to_string(), DEFAULT_BROADCAST_SENDER_CAPACITY);
52                new_sender.subscribe()
53            }
54        }
55    }
56
57    pub fn send(&self, key: &str, data: T) -> BroadcastMapSendResult<T> {
58        match self.get_sender().get(key) {
59            Some(sender) => sender.send(data).map(|result| Some(result)),
60            None => Ok(None),
61        }
62    }
63}