]> git.lizzy.rs Git - rust.git/blob - crates/rust-analyzer/src/lsp_utils.rs
Merge branch 'Veetaha-feat/sync-branch'
[rust.git] / crates / rust-analyzer / src / lsp_utils.rs
1 //! Utilities for LSP-related boilerplate code.
2
3 use crossbeam_channel::Sender;
4 use lsp_server::{Message, Notification, Request, RequestId};
5 use ra_db::Canceled;
6 use serde::{de::DeserializeOwned, Serialize};
7 use std::error::Error;
8
9 pub fn show_message(
10     typ: lsp_types::MessageType,
11     message: impl Into<String>,
12     sender: &Sender<Message>,
13 ) {
14     let message = message.into();
15     let params = lsp_types::ShowMessageParams { typ, message };
16     let not = notification_new::<lsp_types::notification::ShowMessage>(params);
17     sender.send(not.into()).unwrap();
18 }
19
20 pub(crate) fn is_canceled(e: &(dyn Error + 'static)) -> bool {
21     e.downcast_ref::<Canceled>().is_some()
22 }
23
24 pub(crate) fn notification_is<N: lsp_types::notification::Notification>(
25     notification: &Notification,
26 ) -> bool {
27     notification.method == N::METHOD
28 }
29
30 pub(crate) fn notification_cast<N>(notification: Notification) -> Result<N::Params, Notification>
31 where
32     N: lsp_types::notification::Notification,
33     N::Params: DeserializeOwned,
34 {
35     notification.extract(N::METHOD)
36 }
37
38 pub(crate) fn notification_new<N>(params: N::Params) -> Notification
39 where
40     N: lsp_types::notification::Notification,
41     N::Params: Serialize,
42 {
43     Notification::new(N::METHOD.to_string(), params)
44 }
45
46 pub(crate) fn request_new<R>(id: RequestId, params: R::Params) -> Request
47 where
48     R: lsp_types::request::Request,
49     R::Params: Serialize,
50 {
51     Request::new(id, R::METHOD.to_string(), params)
52 }