fn stdio()

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)
}