diff options
author | Norbert Preining <norbert@preining.info> | 2020-05-28 03:03:21 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2020-05-28 03:03:21 +0000 |
commit | 745892fbddea56040139108277e728b53fd8fc11 (patch) | |
tree | 15e55e299b38fccdabce8364f1fbf4f02ef37994 /support/texlab/crates/jsonrpc/src/lib.rs | |
parent | 195ca7e0c377d83455867bdd8e409d4e1cf024ea (diff) |
CTAN sync 202005280303
Diffstat (limited to 'support/texlab/crates/jsonrpc/src/lib.rs')
-rw-r--r-- | support/texlab/crates/jsonrpc/src/lib.rs | 73 |
1 files changed, 34 insertions, 39 deletions
diff --git a/support/texlab/crates/jsonrpc/src/lib.rs b/support/texlab/crates/jsonrpc/src/lib.rs index 8786598d58..3a771e6ba5 100644 --- a/support/texlab/crates/jsonrpc/src/lib.rs +++ b/support/texlab/crates/jsonrpc/src/lib.rs @@ -8,59 +8,54 @@ pub use self::{ types::*, }; -use futures::channel::*; -use futures::prelude::*; +use futures::{channel::mpsc, prelude::*}; use log::error; -use std::io; use std::sync::Arc; -pub struct MessageHandler<S, C, I> { +#[derive(Debug)] +pub struct MessageHandler<S, C> { pub server: Arc<S>, pub client: Arc<C>, - pub input: I, pub output: mpsc::Sender<String>, } -impl<S, C, I> MessageHandler<S, C, I> +impl<S, C> MessageHandler<S, C> where S: RequestHandler + Middleware + Send + Sync + 'static, C: ResponseHandler + Send + Sync + 'static, - I: Stream<Item = io::Result<String>> + Unpin, { - pub async fn listen(&mut self) { - while let Some(json) = self.input.next().await { - self.server.before_message().await; + pub async fn handle(&mut self, json: &str) { + self.server.before_message().await; - match serde_json::from_str(&json.unwrap()).map_err(|_| Error::parse_error()) { - Ok(Message::Request(request)) => { - let server = Arc::clone(&self.server); - let mut output = self.output.clone(); - tokio::spawn(async move { - let response = server.handle_request(request).await; - if let Some(error) = response.error.as_ref() { - error!("{:?}", error); - } - let json = serde_json::to_string(&response).unwrap(); - output.send(json).await.unwrap(); - server.after_message().await; - }); - } - Ok(Message::Notification(notification)) => { - self.server.handle_notification(notification); - self.after_message(); - } - Ok(Message::Response(response)) => { - self.client.handle(response).await; - self.after_message(); - } - Err(why) => { - let response = Response::error(why, None); + match serde_json::from_str(json).map_err(|_| Error::parse_error()) { + Ok(Message::Request(request)) => { + let server = Arc::clone(&self.server); + let mut output = self.output.clone(); + tokio::spawn(async move { + let response = server.handle_request(request).await; + if let Some(error) = response.error.as_ref() { + error!("{:?}", error); + } let json = serde_json::to_string(&response).unwrap(); - self.output.send(json).await.unwrap(); - self.after_message(); - } - }; - } + output.send(json).await.unwrap(); + server.after_message().await; + }); + } + Ok(Message::Notification(notification)) => { + self.server.handle_notification(notification).await; + self.after_message(); + } + Ok(Message::Response(response)) => { + self.client.handle(response).await; + self.after_message(); + } + Err(why) => { + let response = Response::error(why, None); + let json = serde_json::to_string(&response).unwrap(); + self.output.send(json).await.unwrap(); + self.after_message(); + } + }; } fn after_message(&self) { |