1pub mod build;
11mod generated;
12mod observer;
13mod tdjson;
14
15pub use generated::{enums, functions, types};
16
17use enums::Update;
18use once_cell::sync::Lazy;
19use serde_json::Value;
20use std::sync::atomic::{AtomicU32, Ordering};
21
22static EXTRA_COUNTER: AtomicU32 = AtomicU32::new(0);
23static OBSERVER: Lazy<observer::Observer> = Lazy::new(observer::Observer::new);
24
25pub fn create_client() -> i32 {
28 tdjson::create_client()
29}
30
31pub fn receive() -> Option<(Update, i32)> {
36 let response = tdjson::receive(2.0);
37 if let Some(response_str) = response {
38 let response: Value = serde_json::from_str(&response_str).unwrap();
39
40 match response.get("@extra") {
41 Some(_) => {
42 OBSERVER.notify(response);
43 }
44 None => {
45 let client_id = response["@client_id"].as_i64().unwrap() as i32;
46 match serde_json::from_value(response) {
47 Ok(update) => {
48 return Some((update, client_id));
49 }
50 Err(e) => {
51 log::warn!(
52 "Received an unknown response: {}\nReason: {}",
53 response_str,
54 e
55 );
56 }
57 }
58 }
59 }
60 }
61
62 None
63}
64
65pub(crate) async fn send_request(client_id: i32, mut request: Value) -> Value {
66 let extra = EXTRA_COUNTER.fetch_add(1, Ordering::Relaxed);
67 request["@extra"] = serde_json::to_value(extra).unwrap();
68
69 let receiver = OBSERVER.subscribe(extra);
70 tdjson::send(client_id, request.to_string());
71
72 receiver.await.unwrap()
73}