show error to the user when deserializing config

This commit is contained in:
Aleksey Kladov 2019-08-22 11:08:22 +03:00
parent 5fd9a5be09
commit 4dd5afb7fe
3 changed files with 22 additions and 8 deletions

View File

@ -11,5 +11,8 @@ mod world;
pub type Result<T> = std::result::Result<T, Box<dyn std::error::Error + Send + Sync>>;
pub use crate::{
caps::server_capabilities, config::ServerConfig, main_loop::main_loop, main_loop::LspError,
caps::server_capabilities,
config::ServerConfig,
main_loop::LspError,
main_loop::{main_loop, show_message},
};

View File

@ -1,8 +1,7 @@
use flexi_logger::{Duplicate, Logger};
use gen_lsp_server::{run_server, stdio_transport};
use serde::Deserialize;
use ra_lsp_server::{Result, ServerConfig};
use ra_lsp_server::{show_message, Result, ServerConfig};
use ra_prof;
fn main() -> Result<()> {
@ -46,15 +45,23 @@ fn main_inner() -> Result<()> {
.filter(|workspaces| !workspaces.is_empty())
.unwrap_or_else(|| vec![root]);
let opts = params
let server_config: ServerConfig = params
.initialization_options
.and_then(|v| {
ServerConfig::deserialize(v)
.map_err(|e| log::error!("failed to deserialize config: {}", e))
serde_json::from_value(v)
.map_err(|e| {
log::error!("failed to deserialize config: {}", e);
show_message(
lsp_types::MessageType::Error,
format!("failed to deserialize config: {}", e),
s,
);
})
.ok()
})
.unwrap_or_default();
ra_lsp_server::main_loop(workspace_roots, params.capabilities, opts, r, s)
ra_lsp_server::main_loop(workspace_roots, params.capabilities, server_config, r, s)
})?;
log::info!("shutting down IO...");
threads.join()?;

View File

@ -617,7 +617,11 @@ fn update_file_notifications_on_threadpool(
});
}
fn show_message(typ: req::MessageType, message: impl Into<String>, sender: &Sender<RawMessage>) {
pub fn show_message(
typ: req::MessageType,
message: impl Into<String>,
sender: &Sender<RawMessage>,
) {
let message = message.into();
let params = req::ShowMessageParams { typ, message };
let not = RawNotification::new::<req::ShowMessage>(&params);