From 120789804d5483f14c9682b2b777adf6d2992547 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 10 Aug 2018 21:13:39 +0300 Subject: Add line index --- codeless/server/src/dispatch.rs | 41 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 36 insertions(+), 5 deletions(-) (limited to 'codeless/server/src/dispatch.rs') diff --git a/codeless/server/src/dispatch.rs b/codeless/server/src/dispatch.rs index ee87fa6c3..41437b62a 100644 --- a/codeless/server/src/dispatch.rs +++ b/codeless/server/src/dispatch.rs @@ -9,8 +9,8 @@ use drop_bomb::DropBomb; use ::{ Result, - req::Request, - io::{Io, RawMsg, RawResponse, RawRequest}, + req::{Request, Notification}, + io::{Io, RawMsg, RawResponse, RawRequest, RawNotification}, }; pub struct Responder { @@ -52,7 +52,7 @@ impl Responder } -pub fn parse_as(raw: RawRequest) -> Result<::std::result::Result<(R::Params, Responder), RawRequest>> +pub fn parse_request_as(raw: RawRequest) -> Result<::std::result::Result<(R::Params, Responder), RawRequest>> where R: Request, R::Params: DeserializeOwned, @@ -71,13 +71,13 @@ pub fn parse_as(raw: RawRequest) -> Result<::std::result::Result<(R::Params, Ok(Ok((params, responder))) } -pub fn expect(io: &mut Io, raw: RawRequest) -> Result)>> +pub fn expect_request(io: &mut Io, raw: RawRequest) -> Result)>> where R: Request, R::Params: DeserializeOwned, R::Result: Serialize, { - let ret = match parse_as::(raw)? { + let ret = match parse_request_as::(raw)? { Ok(x) => Some(x), Err(raw) => { unknown_method(io, raw)?; @@ -87,6 +87,37 @@ pub fn expect(io: &mut Io, raw: RawRequest) -> Result(raw: RawNotification) -> Result<::std::result::Result> + where + N: Notification, + N::Params: DeserializeOwned, +{ + if raw.method != N::METHOD { + return Ok(Err(raw)); + } + let params: N::Params = serde_json::from_value(raw.params)?; + Ok(Ok(params)) +} + +pub fn handle_notification(not: &mut Option, f: F) -> Result<()> + where + N: Notification, + N::Params: DeserializeOwned, + F: FnOnce(N::Params) -> Result<()> +{ + match not.take() { + None => Ok(()), + Some(n) => match parse_notification_as::(n)? { + Ok(params) => f(params), + Err(n) => { + *not = Some(n); + Ok(()) + }, + } + } +} + + pub fn unknown_method(io: &mut Io, raw: RawRequest) -> Result<()> { error(io, raw.id, ErrorCode::MethodNotFound, "unknown method") } -- cgit v1.2.3