use tokio::net::{TcpListener, TcpStream};
use tower_lsp_server::{LspService, Server};
#[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 mut args = std::env::args();
let stream = match args.nth(1).as_deref() {
None => {
TcpStream::connect("127.0.0.1:9257").await?
}
Some("--listen") => {
let listener = TcpListener::bind("127.0.0.1:9257").await?;
let (stream, _) = listener.accept().await?;
stream
}
Some(arg) => {
panic!("Unrecognized argument: {arg}. Use --listen to listen for connections.")
}
};
let (read, write) = tokio::io::split(stream);
#[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(())
}