Skip to content

Commit b7ffbab

Browse files
committed
feat: correctly cast notifications
1 parent 9a9a8ed commit b7ffbab

File tree

2 files changed

+33
-26
lines changed

2 files changed

+33
-26
lines changed

src/lib.rs

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,12 @@ impl LanguageServer {
105105
}
106106

107107
fn handle_request(&self, req: Request) -> Result<(), Box<dyn std::error::Error>> {
108-
let req = match cast_r::<request::ExecuteCommand>(req) {
108+
let req = match try_cast_r::<request::ExecuteCommand>(req)? {
109109
Ok((id, params)) => {
110110
self.execute_command(id, &params)?;
111111
return Ok(());
112112
}
113-
Err(err @ ExtractError::JsonError { .. }) => panic!("{err:?}"),
114-
Err(ExtractError::MethodMismatch(req)) => req,
113+
Err(req) => req,
115114
};
116115

117116
let _ = req;
@@ -123,43 +122,36 @@ impl LanguageServer {
123122
&self,
124123
notification: Notification,
125124
) -> Result<(), Box<dyn std::error::Error>> {
126-
let notification = match cast_n::<notification::DidOpenTextDocument>(notification) {
127-
Ok((_id, params)) => {
125+
let notification = match try_cast_n::<notification::DidOpenTextDocument>(notification)? {
126+
Ok(params) => {
128127
self.on_change(&params.text_document.uri, false)?;
129128
return Ok(());
130129
}
131-
Err(err @ ExtractError::JsonError { .. }) => {
132-
eprintln!("{err:?}");
133-
return Ok(());
134-
}
135-
Err(ExtractError::MethodMismatch(req)) => req,
130+
Err(req) => req,
136131
};
137132

138-
let notification = match cast_n::<notification::DidChangeTextDocument>(notification) {
139-
Ok((_id, params)) => {
133+
let notification = match try_cast_n::<notification::DidChangeTextDocument>(notification)? {
134+
Ok(params) => {
140135
self.on_change(&params.text_document.uri, false)?;
141136
return Ok(());
142137
}
143-
Err(err @ ExtractError::JsonError { .. }) => panic!("{err:?}"),
144-
Err(ExtractError::MethodMismatch(req)) => req,
138+
Err(req) => req,
145139
};
146140

147-
let notification = match cast_n::<notification::DidCloseTextDocument>(notification) {
148-
Ok((_id, params)) => {
141+
let notification = match try_cast_n::<notification::DidCloseTextDocument>(notification)? {
142+
Ok(params) => {
149143
self.on_change(&params.text_document.uri, false)?;
150144
return Ok(());
151145
}
152-
Err(err @ ExtractError::JsonError { .. }) => panic!("{err:?}"),
153-
Err(ExtractError::MethodMismatch(req)) => req,
146+
Err(req) => req,
154147
};
155148

156-
let notification = match cast_n::<notification::DidSaveTextDocument>(notification) {
157-
Ok((_id, params)) => {
149+
let notification = match try_cast_n::<notification::DidSaveTextDocument>(notification)? {
150+
Ok(params) => {
158151
self.on_change(&params.text_document.uri, true)?;
159152
return Ok(());
160153
}
161-
Err(err @ ExtractError::JsonError { .. }) => panic!("{err:?}"),
162-
Err(ExtractError::MethodMismatch(req)) => req,
154+
Err(req) => req,
163155
};
164156

165157
let _ = notification;
@@ -256,18 +248,29 @@ impl LanguageServer {
256248
}
257249
}
258250

259-
fn cast_r<R>(req: Request) -> Result<(RequestId, R::Params), ExtractError<Request>>
251+
// first result if for json decoding error, second is for method mismatch
252+
type CastResult<Payload, Type> = Result<Result<Payload, Type>, ExtractError<Type>>;
253+
254+
fn try_cast_r<R>(req: Request) -> CastResult<(RequestId, R::Params), Request>
260255
where
261256
R: lsp_types::request::Request,
262257
R::Params: serde::de::DeserializeOwned,
263258
{
264-
req.extract(R::METHOD)
259+
match req.extract(R::METHOD) {
260+
Ok(params) => Ok(Ok(params)),
261+
Err(ExtractError::MethodMismatch(req)) => Ok(Err(req)),
262+
Err(err) => Err(err),
263+
}
265264
}
266265

267-
fn cast_n<N>(req: Notification) -> Result<(RequestId, N::Params), ExtractError<Notification>>
266+
fn try_cast_n<N>(notif: Notification) -> CastResult<N::Params, Notification>
268267
where
269268
N: lsp_types::notification::Notification,
270269
N::Params: serde::de::DeserializeOwned,
271270
{
272-
req.extract(N::METHOD)
271+
match notif.extract(N::METHOD) {
272+
Ok(params) => Ok(Ok(params)),
273+
Err(ExtractError::MethodMismatch(notif)) => Ok(Err(notif)),
274+
Err(err) => Err(err),
275+
}
273276
}

src/main.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ const USAGE: &str = concat!(
1515
);
1616

1717
fn main() -> Result<(), Box<dyn std::error::Error>> {
18+
// Easier to see in editor logs if the current developement version is loaded
19+
#[cfg(debug_assertions)]
20+
eprintln!("DEBUG VERSION");
21+
1822
let mut args = env::args();
1923
let _binary = args.next();
2024

0 commit comments

Comments
 (0)