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            broadcast: DashMap::new(),
9        }
10    }
11}
12
13impl<T: BroadcastMapTrait> BroadcastMap<T> {
14    pub fn new() -> Self {
15        Self::default()
16    }
17
18    pub fn insert<K>(&self, key: K, capacity: usize) -> OptionBroadcast<T>
19    where
20        K: ToString,
21    {
22        let key_string: String = key.to_string();
23        let broadcast: Broadcast<T> = Broadcast::new(capacity);
24        self.get_broadcast().insert(key_string, broadcast)
25    }
26
27    pub fn receiver_count(&self, key: &str) -> OptionReceiverCount {
28        self.get_broadcast()
29            .get(key)
30            .map(|receiver| receiver.receiver_count())
31    }
32
33    pub fn subscribe(&self, key: &str) -> OptionBroadcastMapReceiver<T> {
34        self.get_broadcast()
35            .get(key)
36            .map(|receiver| receiver.subscribe())
37    }
38
39    pub fn subscribe_unwrap_or_insert(&self, key: &str) -> BroadcastMapReceiver<T> {
40        match self.get_broadcast().get(key) {
41            Some(sender) => sender.subscribe(),
42            None => {
43                self.insert(key, DEFAULT_BROADCAST_SENDER_CAPACITY);
44                self.subscribe_unwrap_or_insert(key)
45            }
46        }
47    }
48
49    pub fn send(&self, key: &str, data: T) -> BroadcastMapSendResult<T> {
50        match self.get_broadcast().get(key) {
51            Some(sender) => sender.send(data).map(|result| Some(result)),
52            None => Ok(None),
53        }
54    }
55}