hyperlane_broadcast/broadcast_map/
impl.rs1use 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}