diff options
Diffstat (limited to 'crates/gen_lsp_server/src/stdio.rs')
-rw-r--r-- | crates/gen_lsp_server/src/stdio.rs | 57 |
1 files changed, 0 insertions, 57 deletions
diff --git a/crates/gen_lsp_server/src/stdio.rs b/crates/gen_lsp_server/src/stdio.rs deleted file mode 100644 index f8931f2dc..000000000 --- a/crates/gen_lsp_server/src/stdio.rs +++ /dev/null | |||
@@ -1,57 +0,0 @@ | |||
1 | use std::{ | ||
2 | io::{stdin, stdout}, | ||
3 | thread, | ||
4 | }; | ||
5 | |||
6 | use crossbeam_channel::{bounded, Receiver, Sender}; | ||
7 | use lsp_types::notification::Exit; | ||
8 | |||
9 | use crate::{RawMessage, Result}; | ||
10 | |||
11 | pub fn stdio_transport() -> (Receiver<RawMessage>, Sender<RawMessage>, Threads) { | ||
12 | let (writer_sender, writer_receiver) = bounded::<RawMessage>(16); | ||
13 | let writer = thread::spawn(move || { | ||
14 | let stdout = stdout(); | ||
15 | let mut stdout = stdout.lock(); | ||
16 | writer_receiver.into_iter().try_for_each(|it| it.write(&mut stdout))?; | ||
17 | Ok(()) | ||
18 | }); | ||
19 | let (reader_sender, reader_receiver) = bounded::<RawMessage>(16); | ||
20 | let reader = thread::spawn(move || { | ||
21 | let stdin = stdin(); | ||
22 | let mut stdin = stdin.lock(); | ||
23 | while let Some(msg) = RawMessage::read(&mut stdin)? { | ||
24 | let is_exit = match &msg { | ||
25 | RawMessage::Notification(n) => n.is::<Exit>(), | ||
26 | _ => false, | ||
27 | }; | ||
28 | |||
29 | reader_sender.send(msg).unwrap(); | ||
30 | |||
31 | if is_exit { | ||
32 | break; | ||
33 | } | ||
34 | } | ||
35 | Ok(()) | ||
36 | }); | ||
37 | let threads = Threads { reader, writer }; | ||
38 | (reader_receiver, writer_sender, threads) | ||
39 | } | ||
40 | |||
41 | pub struct Threads { | ||
42 | reader: thread::JoinHandle<Result<()>>, | ||
43 | writer: thread::JoinHandle<Result<()>>, | ||
44 | } | ||
45 | |||
46 | impl Threads { | ||
47 | pub fn join(self) -> Result<()> { | ||
48 | match self.reader.join() { | ||
49 | Ok(r) => r?, | ||
50 | Err(_) => Err("reader panicked")?, | ||
51 | } | ||
52 | match self.writer.join() { | ||
53 | Ok(r) => r, | ||
54 | Err(_) => Err("writer panicked")?, | ||
55 | } | ||
56 | } | ||
57 | } | ||