2 io::{self, stdin, stdout},
6 use crossbeam_channel::{bounded, Receiver, Sender};
10 /// Creates an LSP connection via stdio.
11 pub(crate) fn stdio_transport() -> (Sender<Message>, Receiver<Message>, IoThreads) {
12 let (writer_sender, writer_receiver) = bounded::<Message>(0);
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))?;
19 let (reader_sender, reader_receiver) = bounded::<Message>(0);
20 let reader = thread::spawn(move || {
22 let mut stdin = stdin.lock();
23 while let Some(msg) = Message::read(&mut stdin)? {
24 let is_exit = match &msg {
25 Message::Notification(n) => n.is_exit(),
29 reader_sender.send(msg).unwrap();
37 let threads = IoThreads { reader, writer };
38 (writer_sender, reader_receiver, threads)
41 // Creates an IoThreads
42 pub(crate) fn make_io_threads(
43 reader: thread::JoinHandle<io::Result<()>>,
44 writer: thread::JoinHandle<io::Result<()>>,
46 IoThreads { reader, writer }
49 pub struct IoThreads {
50 reader: thread::JoinHandle<io::Result<()>>,
51 writer: thread::JoinHandle<io::Result<()>>,
55 pub fn join(self) -> io::Result<()> {
56 match self.reader.join() {
59 println!("reader panicked!");
60 std::panic::panic_any(err)
63 match self.writer.join() {
66 println!("writer panicked!");
67 std::panic::panic_any(err);