1use super::common::*;
2
3pub struct Dispatch<T: Send + Message + 'static>(
4 Arc<RwLock<Option<Sender<T>>>>,
5 Storage<cb_channel::Sender<T>>,
6);
7
8impl<T: Send + Message + Clone + std::fmt::Debug + 'static> Default for Dispatch<T> {
9 fn default() -> Self {
10 Self {
11 0: Arc::new(RwLock::new(None)),
12 1: Storage::new(),
13 }
14 }
15}
16
17impl<T: Send + Message + Clone + std::fmt::Debug + 'static> Dispatch<T> {
18 pub async fn register(&self, sender: Sender<T>, sync_sender: cb_channel::Sender<T>) {
19 let mut bis = self.0.write().await;
20 *bis = Some(sender);
21 self.1.set(sync_sender);
22 }
23
24 pub async fn event(&self, ev: T) {
25 if let Some(s) = self.0.read().await.as_ref() {
26 if let Err(e) = s.send(ev.clone()) {
27 log::error!("{:#?}", e);
28 }
29 }
30 }
31
32 pub fn sync_event(&self, ev: T) {
33 if let Some(s) = self.1.try_get() {
34 if let Err(e) = s.send(ev) {
35 log::error!("{:#?}", e);
36 }
37 }
38 }
39}