telegram_client/
handler.rs

1use rtdlib::types as rtd_types;
2use rtdlib::types::RObject;
3
4use crate::api::Api;
5use crate::errors::TGError;
6use crate::listener::lasync::RasyncLout;
7use crate::listener::levent::EventLout;
8use crate::observer;
9use crate::tip;
10
11pub struct Handler<'a> {
12  api: &'a Api,
13  event_lout: &'a EventLout,
14  rasync_lout: &'a RasyncLout,
15  warn_unregister_listener: &'a bool,
16}
17
18impl<'a> Handler<'a> {
19  pub(crate) fn new(
20    api: &'a Api,
21    event_lout: &'a EventLout,
22    rasync_lout: &'a RasyncLout,
23    warn_unregister_listener: &'a bool
24  ) -> Self {
25    Self {
26      api,
27      event_lout,
28      rasync_lout,
29      warn_unregister_listener,
30    }
31  }
32
33  pub async fn handle(&self, json: &'a String) {
34    // event listener
35    if let Some(ev) = self.event_lout.receive() {
36      if let Err(e) = ev((self.api, json)) {
37        if let Some(ev) = self.event_lout.exception() {
38          ev((self.api, &e));
39        }
40      }
41    }
42    // async listener
43    if let Some(ev) = self.rasync_lout.receive() {
44      if let Err(e) = ev((self.api.clone(), json.clone())).await {
45        if let Some(ev) = self.rasync_lout.exception() {
46          ev((self.api.clone(), e)).await;
47        }
48      }
49    }
50
51    match rtd_types::from_json::<rtd_types::TdType>(json) {
52      Ok(t) => {
53
54        // observer handler
55        observer::notify(t.clone());
56
57        // event listener
58        match self.event_lout.handle_type(self.api, &t) {
59          Ok(true) => return,
60          Ok(false) => {
61            if *self.warn_unregister_listener {
62              warn!("{}", tip::un_register_listener(t.td_name()));
63            }
64          }
65          Err(_err) => {
66            if let Some(ev) = self.event_lout.exception() {
67              ev((self.api, &TGError::new("EVENT_HANDLER_ERROR")));
68            }
69          }
70        }
71
72        // async listener
73        match self.rasync_lout.handle_type(self.api, &t).await {
74          Ok(true) => return,
75          Ok(false) => {
76            if *self.warn_unregister_listener {
77              warn!("{}", tip::un_register_listener(t.td_name()));
78            }
79          }
80          Err(_err) => {
81            if let Some(ev) = self.rasync_lout.exception() {
82              ev((self.api.clone(), TGError::new("EVENT_HANDLER_ERROR"))).await;
83            }
84          }
85        }
86
87      }
88      Err(e) => {
89        error!("{}", tip::data_fail_with_json(json));
90        // eprintln!("{:?}", e);
91        error!("{:?}", e);
92        // event listener
93        if let Some(ev) = self.event_lout.exception() {
94          ev((self.api, &TGError::new("DESERIALIZE_JSON_FAIL")));
95        }
96        // async listener
97        if let Some(ev) = self.rasync_lout.exception() {
98          ev((self.api.clone(), TGError::new("DESERIALIZE_JSON_FAIL"))).await;
99        }
100      }
101    }
102  }
103}
104
105
106
107