From 3588d6b2da6e63730cc560c9986ba7fda5de816e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 1 Sep 2018 16:18:02 +0300 Subject: add gen_lsp_server --- crates/gen_lsp_server/src/stdio.rs | 49 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 crates/gen_lsp_server/src/stdio.rs (limited to 'crates/gen_lsp_server/src/stdio.rs') diff --git a/crates/gen_lsp_server/src/stdio.rs b/crates/gen_lsp_server/src/stdio.rs new file mode 100644 index 000000000..81397bb2a --- /dev/null +++ b/crates/gen_lsp_server/src/stdio.rs @@ -0,0 +1,49 @@ +use std::{ + thread, + io::{ + stdout, stdin, + }, +}; + +use crossbeam_channel::{Receiver, Sender, bounded}; + +use {RawMessage, Result}; + +pub fn stdio_transport() -> (Receiver, Sender, Threads) { + let (writer_sender, mut writer_receiver) = bounded::(16); + let writer = thread::spawn(move || { + let stdout = stdout(); + let mut stdout = stdout.lock(); + writer_receiver.try_for_each(|it| it.write(&mut stdout))?; + Ok(()) + }); + let (reader_sender, reader_receiver) = bounded::(16); + let reader = thread::spawn(move || { + let stdin = stdin(); + let mut stdin = stdin.lock(); + while let Some(msg) = RawMessage::read(&mut stdin)? { + reader_sender.send(msg); + } + Ok(()) + }); + let threads = Threads { reader, writer }; + (reader_receiver, writer_sender, threads) +} + +pub struct Threads { + reader: thread::JoinHandle>, + writer: thread::JoinHandle>, +} + +impl Threads { + pub fn join(self) -> Result<()> { + match self.reader.join() { + Ok(r) => r?, + Err(_) => bail!("reader panicked"), + } + match self.writer.join() { + Ok(r) => r, + Err(_) => bail!("writer panicked"), + } + } +} -- cgit v1.2.3