ev_apple/
dispatch.rs

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}