From c89b1acb6e5d5755dc79c1f5643c915624a4c4c3 Mon Sep 17 00:00:00 2001 From: syn Date: Tue, 19 May 2020 20:54:45 +0300 Subject: Some kind of working code --- src/update.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/update.rs (limited to 'src/update.rs') 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 Handler for C +where C: Send + Sync + 'static + Fn(JsonValue) -> F, + F: Future + 'static + Send { + fn handle(&self, req: JsonValue) -> BoxFuture<'static, ()> { + Box::pin((*self)(req)) + } +} + +pub struct UpdateRouter { + router: HashMap>, + rt: tokio::runtime::Handle, +} + +impl UpdateRouter { + pub fn new(rt: tokio::runtime::Handle) -> Self { + Self { + router: HashMap::new(), + rt: rt + } + } + pub fn add_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(()) }); + } +} -- cgit v1.2.1-18-gbd029