in crates/lsp-client/src/server.rs [90:125]
fn stdio(
mut child: Child,
) -> (
UnboundedSender<Message>,
UnboundedReceiver<Message>,
IoThreads,
) {
let (writer_sender, mut writer_receiver) = unbounded_channel::<Message>();
let writer = tokio::spawn(async move {
let stdin = child.stdin.take().unwrap();
let mut bufr = BufWriter::new(stdin);
while let Some(it) = writer_receiver.recv().await {
let is_exit = matches!(&it, Message::Notification(n) if n.is_exit());
debug!("sending message {:#?}", it);
it.write(&mut bufr).await?;
if is_exit {
break;
}
}
Ok(())
});
let (reader_sender, reader_receiver) = unbounded_channel::<Message>();
let reader = tokio::spawn(async move {
let stdout = child.stdout.take().unwrap();
let mut reader = BufReader::new(stdout);
while let Some(msg) = Message::read(&mut reader).await? {
debug!("received message {:#?}", msg);
reader_sender
.send(msg)
.expect("receiver was dropped, failed to send a message");
}
Ok(())
});
let threads = IoThreads { reader, writer };
(writer_sender, reader_receiver, threads)
}