diff options
Diffstat (limited to 'src/client.rs')
-rw-r--r-- | src/client.rs | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/src/client.rs b/src/client.rs index 0e215f8..b105311 100644 --- a/src/client.rs +++ b/src/client.rs @@ -18,7 +18,7 @@ use crossbeam::channel::{ use uuid::Uuid; use std::collections::HashMap; use serde_json::Value as JsonValue; -use crate::update::{ UpdateRouter, Handler }; +use crate::update::Handler; use pert_types::types::Update; @@ -62,7 +62,7 @@ pub struct Client { } impl Client { - pub fn new(log_opt: Option<i32>, updater: UpdateRouter) -> Self { + pub fn new<H: Handler>(log_opt: Option<i32>, updater: H) -> Self { if let Some(log) = log_opt { Tdlib::set_log_verbosity_level(log).ok(); } @@ -73,10 +73,11 @@ impl Client { let api_for_listener = api.clone(); let api_for_responder = api.clone(); let sender_for_responder = tx.clone(); + let rt = tokio::runtime::Handle::try_current().expect("Must be in runtime"); let _run_handle = thread::spawn( move || OneshotResponder::new(rx, api_for_responder).run( - updater, Self { sender: sender_for_responder } + updater, Self { sender: sender_for_responder }, rt ) ); let _tg_handle = thread::spawn( @@ -129,7 +130,7 @@ impl OneshotResponder { } } - fn run(&mut self, updater: UpdateRouter, client: Client) { + fn run<H: Handler>(&mut self, updater: H, client: Client, rt: tokio::runtime::Handle) { loop { match self.rx.recv() { Ok(JoinStreams::NewRequest(fut)) => { @@ -156,7 +157,12 @@ impl OneshotResponder { Ok(val) => { let typ = val["@type"].as_str().unwrap(); if typ.starts_with("update") { - updater.dispatch(&client, val); + match serde_json::from_value(val.clone()) { + Ok(upd) => { rt.spawn(updater.handle(client.clone(), upd)); }, + Err(err) => { + error!("Could not deser update: {}, was: {}", err, val); + } + }; } else { self.handle_response(val); } |