telegram_client/
handler.rs1use 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 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 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::notify(t.clone());
56
57 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 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 error!("{:?}", e);
92 if let Some(ev) = self.event_lout.exception() {
94 ev((self.api, &TGError::new("DESERIALIZE_JSON_FAIL")));
95 }
96 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