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!("Received an unknown response: {response_str}\nReason: {e}");
52 }
53 }
54 }
55 }
56 }
57
58 None
59}
60
61pub(crate) async fn send_request(client_id: i32, mut request: Value) -> Value {
62 let extra = EXTRA_COUNTER.fetch_add(1, Ordering::Relaxed);
63 request["@extra"] = serde_json::to_value(extra).unwrap();
64
65 let receiver = OBSERVER.subscribe(extra);
66 tdjson::send(client_id, request.to_string());
67
68 receiver.await.unwrap()
69}