summaryrefslogtreecommitdiffstats
path: root/src/update.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/update.rs')
-rw-r--r--src/update.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/update.rs b/src/update.rs
new file mode 100644
index 0000000..a6884e3
--- /dev/null
+++ b/src/update.rs
@@ -0,0 +1,40 @@
+use std::collections::HashMap;
+use json::JsonValue;
+use std::future::Future;
+use futures::future::BoxFuture;
+
+pub trait Handler: Send + Sync + 'static {
+ fn handle(&self, _: JsonValue) -> BoxFuture<'static, ()>;
+}
+
+impl<C, F> Handler for C
+where C: Send + Sync + 'static + Fn(JsonValue) -> F,
+ F: Future<Output = ()> + 'static + Send {
+ fn handle(&self, req: JsonValue) -> BoxFuture<'static, ()> {
+ Box::pin((*self)(req))
+ }
+}
+
+pub struct UpdateRouter {
+ router: HashMap<String, Box<dyn Handler>>,
+ rt: tokio::runtime::Handle,
+}
+
+impl UpdateRouter {
+ pub fn new(rt: tokio::runtime::Handle) -> Self {
+ Self {
+ router: HashMap::new(),
+ 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) {
+ 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(()) });
+ }
+}