diff options
Diffstat (limited to 'src/update.rs')
-rw-r--r-- | src/update.rs | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/src/update.rs b/src/update.rs index a6884e3..b5b0ba7 100644 --- a/src/update.rs +++ b/src/update.rs @@ -1,17 +1,19 @@ use std::collections::HashMap; -use json::JsonValue; +use serde_json::Value as JsonValue; use std::future::Future; use futures::future::BoxFuture; +use log::{ warn, trace }; +use crate::client::Client; pub trait Handler: Send + Sync + 'static { - fn handle(&self, _: JsonValue) -> BoxFuture<'static, ()>; + fn handle(&self, _: Client, _: JsonValue) -> BoxFuture<'static, ()>; } impl<C, F> Handler for C -where C: Send + Sync + 'static + Fn(JsonValue) -> F, +where C: Send + Sync + 'static + Fn(Client, JsonValue) -> F, F: Future<Output = ()> + 'static + Send { - fn handle(&self, req: JsonValue) -> BoxFuture<'static, ()> { - Box::pin((*self)(req)) + fn handle(&self, client: Client, req: JsonValue) -> BoxFuture<'static, ()> { + Box::pin((*self)(client, req)) } } @@ -24,17 +26,24 @@ impl UpdateRouter { pub fn new(rt: tokio::runtime::Handle) -> Self { Self { router: HashMap::new(), - rt: rt + rt: rt, } } + pub fn add_handler<H: Handler>(&mut self, update_type: &str, handler: H) { self.router.insert(update_type.to_owned(), Box::new(handler)); } - pub fn dispatch(&self, update: JsonValue) { + pub fn dispatch(&self, client: &Client, update: JsonValue) { let update_type: &str = update["@type"].as_str().unwrap(); - self.router.get(update_type) - .and_then(|handler| { self.rt.spawn(handler.handle(update)); Some(()) }) - .or_else(|| { println!("handler not found"); Some(()) }); + match self.router.get(update_type) { + Some(handler) => { + self.rt.spawn(handler.handle(client.clone(), update)); + }, + None => { + warn!("no handler for {}", update_type); + trace!("request was: {}", update); + }, + } } } |