File: websocket.rs

package info (click to toggle)
rust-tower-lsp-server 0.22.1-1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 516 kB
  • sloc: makefile: 2
file content (34 lines) | stat: -rw-r--r-- 1,193 bytes parent folder | download
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
32
33
34
//! Shows how to serve a language server of websockets.

use async_tungstenite::{ByteReader, ByteWriter, tokio::accept_async};
use tokio::net::TcpListener;
use tower_lsp_server::{LspService, Server};
use tracing::info;

// You can check the language server implementation in `examples/common/lsp.rs`.
// The dummy language server provided is common to all transports examples.
#[path = "common/lsp.rs"]
mod lsp;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    #[cfg(feature = "runtime-agnostic")]
    use tokio_util::compat::{TokioAsyncReadCompatExt, TokioAsyncWriteCompatExt};

    tracing_subscriber::fmt().init();

    let listener = TcpListener::bind("127.0.0.1:9257").await?;
    info!("Listening on {}", listener.local_addr()?);
    let (stream, _) = listener.accept().await?;

    let (write, read) = accept_async(stream).await?.split();
    let (write, read) = (ByteWriter::new(write), ByteReader::new(read));

    #[cfg(feature = "runtime-agnostic")]
    let (read, write) = (read.compat(), write.compat_write());

    let (service, socket) = LspService::new(lsp::Backend::new);
    Server::new(read, write, socket).serve(service).await;

    Ok(())
}