migrate gen-lsp-server to new crossbeam

This commit is contained in:
Aleksey Kladov 2018-12-30 23:02:26 +03:00
parent c0d1b17a4e
commit effc1eae8b
4 changed files with 26 additions and 10 deletions

View file

@ -95,7 +95,7 @@ pub fn run_server(
server(params, &receiver, &sender)?;
log::info!("lsp server waiting for exit notification");
match receiver.recv() {
Some(RawMessage::Notification(n)) => n
Ok(RawMessage::Notification(n)) => n
.cast::<Exit>()
.map_err(|n| format_err!("unexpected notification during shutdown: {:?}", n))?,
m => bail!("unexpected message during shutdown: {:?}", m),
@ -109,7 +109,7 @@ pub fn handle_shutdown(req: RawRequest, sender: &Sender<RawMessage>) -> Option<R
match req.cast::<Shutdown>() {
Ok((id, ())) => {
let resp = RawResponse::ok::<Shutdown>(id, &());
sender.send(RawMessage::Response(resp));
let _ = sender.send(RawMessage::Response(resp));
None
}
Err(req) => Some(req),
@ -122,16 +122,16 @@ fn initialize(
caps: ServerCapabilities,
) -> Result<InitializeParams> {
let (id, params) = match receiver.recv() {
Some(RawMessage::Request(req)) => match req.cast::<Initialize>() {
Ok(RawMessage::Request(req)) => match req.cast::<Initialize>() {
Err(req) => bail!("expected initialize request, got {:?}", req),
Ok(req) => req,
},
msg => bail!("expected initialize request, got {:?}", msg),
};
let resp = RawResponse::ok::<Initialize>(id, &InitializeResult { capabilities: caps });
sender.send(RawMessage::Response(resp));
sender.send(RawMessage::Response(resp)).unwrap();
match receiver.recv() {
Some(RawMessage::Notification(n)) => {
Ok(RawMessage::Notification(n)) => {
n.cast::<Initialized>()
.map_err(|_| format_err!("expected initialized notification"))?;
}

View file

@ -9,11 +9,13 @@ use failure::bail;
use crate::{RawMessage, Result};
pub fn stdio_transport() -> (Receiver<RawMessage>, Sender<RawMessage>, Threads) {
let (writer_sender, mut writer_receiver) = bounded::<RawMessage>(16);
let (writer_sender, writer_receiver) = bounded::<RawMessage>(16);
let writer = thread::spawn(move || {
let stdout = stdout();
let mut stdout = stdout.lock();
writer_receiver.try_for_each(|it| it.write(&mut stdout))?;
writer_receiver
.into_iter()
.try_for_each(|it| it.write(&mut stdout))?;
Ok(())
});
let (reader_sender, reader_receiver) = bounded::<RawMessage>(16);
@ -21,7 +23,9 @@ pub fn stdio_transport() -> (Receiver<RawMessage>, Sender<RawMessage>, Threads)
let stdin = stdin();
let mut stdin = stdin.lock();
while let Some(msg) = RawMessage::read(&mut stdin)? {
reader_sender.send(msg);
if let Err(_) = reader_sender.send(msg) {
break;
}
}
Ok(())
});