Skip to content

Commit 6ac871b

Browse files
bors[bot]matklad
andauthored
Merge #3102
3102: Better error messages while deserializing r=matklad a=matklad Co-authored-by: Aleksey Kladov <[email protected]>
2 parents f8d6d6f + 44425ea commit 6ac871b

File tree

3 files changed

+17
-11
lines changed

3 files changed

+17
-11
lines changed

crates/ra_lsp_server/src/lib.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,18 @@ mod config;
3131
mod world;
3232
mod diagnostics;
3333

34+
use serde::de::DeserializeOwned;
35+
3436
pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
3537
pub use crate::{
3638
caps::server_capabilities,
3739
config::ServerConfig,
3840
main_loop::LspError,
3941
main_loop::{main_loop, show_message},
4042
};
43+
44+
pub fn from_json<T: DeserializeOwned>(what: &'static str, json: serde_json::Value) -> Result<T> {
45+
let res = T::deserialize(&json)
46+
.map_err(|e| format!("Failed to deserialize {}: {}; {}", what, e, json))?;
47+
Ok(res)
48+
}

crates/ra_lsp_server/src/main.rs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! `ra_lsp_server` binary
22
33
use lsp_server::Connection;
4-
use ra_lsp_server::{show_message, Result, ServerConfig};
4+
use ra_lsp_server::{from_json, show_message, Result, ServerConfig};
55
use ra_prof;
66

77
fn main() -> Result<()> {
@@ -45,7 +45,8 @@ fn run_server() -> Result<()> {
4545
let server_capabilities = serde_json::to_value(ra_lsp_server::server_capabilities()).unwrap();
4646

4747
let initialize_params = connection.initialize(server_capabilities)?;
48-
let initialize_params: lsp_types::InitializeParams = serde_json::from_value(initialize_params)?;
48+
let initialize_params =
49+
from_json::<lsp_types::InitializeParams>("InitializeParams", initialize_params)?;
4950

5051
if let Some(client_info) = initialize_params.client_info {
5152
log::info!("Client '{}' {}", client_info.name, client_info.version.unwrap_or_default());
@@ -62,17 +63,13 @@ fn run_server() -> Result<()> {
6263
.filter(|workspaces| !workspaces.is_empty())
6364
.unwrap_or_else(|| vec![root]);
6465

65-
let server_config: ServerConfig = initialize_params
66+
let server_config = initialize_params
6667
.initialization_options
6768
.and_then(|v| {
68-
serde_json::from_value(v)
69+
from_json::<ServerConfig>("config", v)
6970
.map_err(|e| {
70-
log::error!("failed to deserialize config: {}", e);
71-
show_message(
72-
lsp_types::MessageType::Error,
73-
format!("failed to deserialize config: {}", e),
74-
&connection.sender,
75-
);
71+
log::error!("{}", e);
72+
show_message(lsp_types::MessageType::Error, e.to_string(), &connection.sender);
7673
})
7774
.ok()
7875
})

crates/ra_lsp_server/src/main_loop/handlers.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ use crate::{
3535
TryConvWithToVec,
3636
},
3737
diagnostics::DiagnosticTask,
38+
from_json,
3839
req::{self, Decoration, InlayHint, InlayHintsParams, InlayKind},
3940
world::WorldSnapshot,
4041
LspError, Result,
@@ -811,7 +812,7 @@ enum CodeLensResolveData {
811812
pub fn handle_code_lens_resolve(world: WorldSnapshot, code_lens: CodeLens) -> Result<CodeLens> {
812813
let _p = profile("handle_code_lens_resolve");
813814
let data = code_lens.data.unwrap();
814-
let resolve = serde_json::from_value(data)?;
815+
let resolve = from_json::<Option<CodeLensResolveData>>("CodeLensResolveData", data)?;
815816
match resolve {
816817
Some(CodeLensResolveData::Impls(lens_params)) => {
817818
let locations: Vec<Location> =

0 commit comments

Comments
 (0)