rust-tdlib 0.4.3

TDlib (Telegram Database library) client
Documentation
use rust_tdlib::client::ClientState;
use rust_tdlib::{
    client::{Client, Worker},
    tdjson,
    types::{TdlibParameters, Update},
};

#[tokio::main]
async fn main() {
    tdjson::set_log_verbosity_level(1);
    env_logger::init();
    let tdlib_parameters = TdlibParameters::builder()
        .database_directory("tddb")
        .use_test_dc(false)
        .api_id(std::env::var("API_ID").unwrap().parse::<i32>().unwrap())
        .api_hash(std::env::var("API_HASH").unwrap())
        .system_language_code("en")
        .device_model("Desktop")
        .system_version("Unknown")
        .application_version(env!("CARGO_PKG_VERSION"))
        .enable_storage_optimizer(true)
        .build();

    let (sender, mut receiver) = tokio::sync::mpsc::channel::<Box<Update>>(100);

    let client = Client::builder()
        .with_tdlib_parameters(tdlib_parameters)
        .with_updates_sender(sender)
        .build()
        .unwrap();

    let mut reader_waiter = tokio::spawn(async move {
        let mut wait_messages: i32 = 100;
        while let Some(message) = receiver.recv().await {
            log::info!("updates handler received {:?}", message);
            wait_messages -= 1;
            if wait_messages == 0 {
                break;
            }
        }
    });

    let mut worker = Worker::builder().build().unwrap();
    let mut waiter = worker.start();

    let v = tokio::select! {
        c = worker.bind_client(client) => {
            match c {
                Ok(cl) => Some(cl),
                Err(e) => panic!("{:?}", e)
            }
        }
        w = &mut waiter => panic!("{:?}", w),
        _ = &mut reader_waiter => {
            log::info!("reader closed");
            None
        },
    };

    if let Some(client) = v {
        log::info!("stop client");
        client.stop().await.unwrap();
        log::info!("client stopped");
        loop {
            if worker.wait_client_state(&client).await.unwrap() == ClientState::Closed {
                log::info!("closed");
                break;
            }
        }
    }

    log::info!("stop worker");
    worker.stop();
}