diff options
author | Aleksey Kladov <[email protected]> | 2018-08-10 19:13:39 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2018-08-10 19:13:39 +0100 |
commit | 120789804d5483f14c9682b2b777adf6d2992547 (patch) | |
tree | bccbe4a72e648516f838499b91e5158484b5cbcd /codeless/server/src/dispatch.rs | |
parent | 1be7af26a83b79863efb0d66a77b1fb7c0235bd2 (diff) |
Add line index
Diffstat (limited to 'codeless/server/src/dispatch.rs')
-rw-r--r-- | codeless/server/src/dispatch.rs | 41 |
1 files changed, 36 insertions, 5 deletions
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; | |||
9 | 9 | ||
10 | use ::{ | 10 | use ::{ |
11 | Result, | 11 | Result, |
12 | req::Request, | 12 | req::{Request, Notification}, |
13 | io::{Io, RawMsg, RawResponse, RawRequest}, | 13 | io::{Io, RawMsg, RawResponse, RawRequest, RawNotification}, |
14 | }; | 14 | }; |
15 | 15 | ||
16 | pub struct Responder<R: Request> { | 16 | pub struct Responder<R: Request> { |
@@ -52,7 +52,7 @@ impl<R: Request> Responder<R> | |||
52 | } | 52 | } |
53 | 53 | ||
54 | 54 | ||
55 | pub fn parse_as<R>(raw: RawRequest) -> Result<::std::result::Result<(R::Params, Responder<R>), RawRequest>> | 55 | pub fn parse_request_as<R>(raw: RawRequest) -> Result<::std::result::Result<(R::Params, Responder<R>), RawRequest>> |
56 | where | 56 | where |
57 | R: Request, | 57 | R: Request, |
58 | R::Params: DeserializeOwned, | 58 | R::Params: DeserializeOwned, |
@@ -71,13 +71,13 @@ pub fn parse_as<R>(raw: RawRequest) -> Result<::std::result::Result<(R::Params, | |||
71 | Ok(Ok((params, responder))) | 71 | Ok(Ok((params, responder))) |
72 | } | 72 | } |
73 | 73 | ||
74 | pub fn expect<R>(io: &mut Io, raw: RawRequest) -> Result<Option<(R::Params, Responder<R>)>> | 74 | pub fn expect_request<R>(io: &mut Io, raw: RawRequest) -> Result<Option<(R::Params, Responder<R>)>> |
75 | where | 75 | where |
76 | R: Request, | 76 | R: Request, |
77 | R::Params: DeserializeOwned, | 77 | R::Params: DeserializeOwned, |
78 | R::Result: Serialize, | 78 | R::Result: Serialize, |
79 | { | 79 | { |
80 | let ret = match parse_as::<R>(raw)? { | 80 | let ret = match parse_request_as::<R>(raw)? { |
81 | Ok(x) => Some(x), | 81 | Ok(x) => Some(x), |
82 | Err(raw) => { | 82 | Err(raw) => { |
83 | unknown_method(io, raw)?; | 83 | unknown_method(io, raw)?; |
@@ -87,6 +87,37 @@ pub fn expect<R>(io: &mut Io, raw: RawRequest) -> Result<Option<(R::Params, Resp | |||
87 | Ok(ret) | 87 | Ok(ret) |
88 | } | 88 | } |
89 | 89 | ||
90 | pub fn parse_notification_as<N>(raw: RawNotification) -> Result<::std::result::Result<N::Params, RawNotification>> | ||
91 | where | ||
92 | N: Notification, | ||
93 | N::Params: DeserializeOwned, | ||
94 | { | ||
95 | if raw.method != N::METHOD { | ||
96 | return Ok(Err(raw)); | ||
97 | } | ||
98 | let params: N::Params = serde_json::from_value(raw.params)?; | ||
99 | Ok(Ok(params)) | ||
100 | } | ||
101 | |||
102 | pub fn handle_notification<N, F>(not: &mut Option<RawNotification>, f: F) -> Result<()> | ||
103 | where | ||
104 | N: Notification, | ||
105 | N::Params: DeserializeOwned, | ||
106 | F: FnOnce(N::Params) -> Result<()> | ||
107 | { | ||
108 | match not.take() { | ||
109 | None => Ok(()), | ||
110 | Some(n) => match parse_notification_as::<N>(n)? { | ||
111 | Ok(params) => f(params), | ||
112 | Err(n) => { | ||
113 | *not = Some(n); | ||
114 | Ok(()) | ||
115 | }, | ||
116 | } | ||
117 | } | ||
118 | } | ||
119 | |||
120 | |||
90 | pub fn unknown_method(io: &mut Io, raw: RawRequest) -> Result<()> { | 121 | pub fn unknown_method(io: &mut Io, raw: RawRequest) -> Result<()> { |
91 | error(io, raw.id, ErrorCode::MethodNotFound, "unknown method") | 122 | error(io, raw.id, ErrorCode::MethodNotFound, "unknown method") |
92 | } | 123 | } |