aboutsummaryrefslogtreecommitdiff
path: root/codeless/server/src/dispatch.rs
diff options
context:
space:
mode:
Diffstat (limited to 'codeless/server/src/dispatch.rs')
-rw-r--r--codeless/server/src/dispatch.rs41
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
10use ::{ 10use ::{
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
16pub struct Responder<R: Request> { 16pub struct Responder<R: Request> {
@@ -52,7 +52,7 @@ impl<R: Request> Responder<R>
52} 52}
53 53
54 54
55pub fn parse_as<R>(raw: RawRequest) -> Result<::std::result::Result<(R::Params, Responder<R>), RawRequest>> 55pub 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
74pub fn expect<R>(io: &mut Io, raw: RawRequest) -> Result<Option<(R::Params, Responder<R>)>> 74pub 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
90pub 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
102pub 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
90pub fn unknown_method(io: &mut Io, raw: RawRequest) -> Result<()> { 121pub 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}