mylang_lsp_server/
sender.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
use actix::{Actor, Context, ContextFutureSpawner, Handler, WrapFuture};
use log::info;
use tokio::io::{self, AsyncWriteExt};

use crate::message::LspMessage;

/// 依頼された応答・通知メッセージを言語クライアントに送信するアクター
pub struct Sender;

impl Actor for Sender {
    type Context = Context<Self>;
}

impl Handler<LspMessage> for Sender {
    type Result = ();

    fn handle(&mut self, msg: LspMessage, ctx: &mut Context<Self>) -> Self::Result {
        info!("--> {:?}", msg);

        async move {
            let mut stdout = io::stdout();
            stdout
                .write_all(msg.raw_message().as_bytes())
                .await
                .unwrap();
            stdout.flush().await.unwrap();
        }
        .into_actor(self)
        .wait(ctx);
    }
}