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