use std::error::Error; use crossbeam_channel::{Receiver, Sender}; use gen_lsp_server::{handle_shutdown, run_server, stdio_transport, RawMessage, RawResponse}; use lsp_types::{ request::{GotoDefinition, GotoDefinitionResponse}, InitializeParams, ServerCapabilities, }; fn main() -> Result<(), Box> { let (receiver, sender, io_threads) = stdio_transport(); run_server(ServerCapabilities::default(), receiver, sender, main_loop)?; io_threads.join()?; Ok(()) } fn main_loop( _params: InitializeParams, receiver: &Receiver, sender: &Sender, ) -> Result<(), Box> { for msg in receiver { match msg { RawMessage::Request(req) => { let req = match handle_shutdown(req, sender) { None => return Ok(()), Some(req) => req, }; match req.cast::() { Ok((id, _params)) => { let resp = RawResponse::ok::( id, &Some(GotoDefinitionResponse::Array(Vec::new())), ); sender.send(RawMessage::Response(resp))?; continue; } Err(req) => req, }; // ... } RawMessage::Response(_resp) => (), RawMessage::Notification(_not) => (), } } Ok(()) }