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 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}