| 49 | |
| 50 | impl Server { |
| 51 | pub fn new<T: Handler>(handler: T) -> Self { |
| 52 | let (write_sender, write_receiver) = bounded::<Message>(0); |
| 53 | let (read_sender, read_receiver) = bounded::<Message>(0); |
| 54 | |
| 55 | let handler_receiver = read_receiver.clone(); |
| 56 | let handler_sender = write_sender.clone(); |
| 57 | let trace_level = Arc::new(RwLock::new(LevelFilter::OFF)); |
| 58 | let level_set = trace_level.clone(); |
| 59 | let request_handler = Builder::new() |
| 60 | .name("LspMessageHandler".into()) |
| 61 | .spawn(move || { |
| 62 | while let Ok(message) = handler_receiver.recv() { |
| 63 | trace!("LspMessageHandler -> {:#?}", &message); |
| 64 | if let Message::Notification(Notification { method, params }) = &message { |
| 65 | if method == "exit" { |
| 66 | break; |
| 67 | } |
| 68 | if method == "$/setTrace" { |
| 69 | let level = from_value::<SetTraceParams>(params.clone()) |
| 70 | .map(|p| match p.value { |
| 71 | lsp_types::TraceValue::Off => LevelFilter::OFF, |
| 72 | lsp_types::TraceValue::Messages => LevelFilter::WARN, |
| 73 | lsp_types::TraceValue::Verbose => LevelFilter::TRACE, |
| 74 | }) |
| 75 | .unwrap_or(LevelFilter::OFF); |
| 76 | trace!("Changing level to {:?}", level); |
| 77 | let mut level_set = level_set.write().unwrap(); |
| 78 | *level_set = level; |
| 79 | } |
| 80 | } |
| 81 | let response = handler.handle(message); |
| 82 | if let Some(response) = response |
| 83 | && let Err(e) = handler_sender.send(response) |
| 84 | { |
| 85 | warn!("Handler failed to send response {:?}", &e); |
| 86 | return Err(io::Error::other(e)); |
| 87 | } |
| 88 | } |
| 89 | warn!("LspMessageHandler closing, channel closed"); |
| 90 | Ok(()) |
| 91 | }) |
| 92 | .expect("Failed to create Reader"); |
| 93 | Server { write_sender, write_receiver, read_sender, read_receiver, request_handler, trace_level } |
| 94 | } |
| 95 | |
| 96 | pub fn tracer(&self) -> TracingLayer { |
| 97 | TracingLayer::new(self.trace_level.clone(), self.write_sender.clone()) |