summaryrefslogtreecommitdiffstats
path: root/src/client.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/client.rs')
-rw-r--r--src/client.rs16
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);
}