pub mod build;
mod generated;
mod observer;
mod tdjson;
pub use generated::{enums, functions, types};
use enums::Update;
use once_cell::sync::Lazy;
use serde_json::Value;
use std::sync::atomic::{AtomicU32, Ordering};
static EXTRA_COUNTER: AtomicU32 = AtomicU32::new(0);
static OBSERVER: Lazy<observer::Observer> = Lazy::new(observer::Observer::new);
pub fn create_client() -> i32 {
tdjson::create_client()
}
pub fn receive() -> Option<(Update, i32)> {
let response = tdjson::receive(2.0);
if let Some(response_str) = response {
let response: Value = serde_json::from_str(&response_str).unwrap();
match response.get("@extra") {
Some(_) => {
OBSERVER.notify(response);
}
None => {
let client_id = response["@client_id"].as_i64().unwrap() as i32;
match serde_json::from_value(response) {
Ok(update) => {
return Some((update, client_id));
}
Err(e) => {
log::warn!("Received an unknown response: {response_str}\nReason: {e}");
}
}
}
}
}
None
}
pub(crate) async fn send_request(client_id: i32, mut request: Value) -> Value {
let extra = EXTRA_COUNTER.fetch_add(1, Ordering::Relaxed);
request["@extra"] = serde_json::to_value(extra).unwrap();
let receiver = OBSERVER.subscribe(extra);
tdjson::send(client_id, request.to_string());
receiver.await.unwrap()
}