81 lines
2.0 KiB
Rust
81 lines
2.0 KiB
Rust
// Relative Modules
|
|
pub mod lsp;
|
|
|
|
// Standard Uses
|
|
|
|
// Local Uses
|
|
use crate::lsp::Backend;
|
|
|
|
// External Uses
|
|
use clap::Parser;
|
|
use tokio::net::TcpListener;
|
|
use tower_lsp::{LspService, Server};
|
|
use ws_stream_tungstenite::WsStream;
|
|
use async_tungstenite::tokio::accept_async;
|
|
|
|
|
|
#[derive(Parser, Debug)]
|
|
#[command(author, version, about, long_about = None)]
|
|
struct Args {
|
|
/// Turn debugging information on
|
|
#[arg(short, long, action = clap::ArgAction::Count)]
|
|
debug: u8,
|
|
|
|
/// Transport method to use
|
|
#[arg(short, long, action, value_enum)]
|
|
transport: String,
|
|
|
|
/// Port to listen for language clients (requires transport set to WebSocket)
|
|
#[arg(short, long, action)]
|
|
port: Option<u16>
|
|
}
|
|
|
|
#[allow(unused)]
|
|
#[derive(Clone, Debug)]
|
|
enum Transport {
|
|
Stdio,
|
|
WebSocket
|
|
}
|
|
|
|
|
|
#[tokio::main]
|
|
async fn main() {
|
|
let args: Args = Args::parse();
|
|
|
|
match args.transport.as_str() {
|
|
"stdio" => main_stdio(args).await,
|
|
"websocket" => main_websocket(args).await,
|
|
_ => {panic!("Only stdio or websocket are accepted")}
|
|
};
|
|
}
|
|
|
|
async fn main_websocket(args: Args) {
|
|
let addr = format!("localhost:{}", args.port.unwrap());
|
|
|
|
let listener = TcpListener::bind(addr).await.unwrap();
|
|
println!("Listening on {}", listener.local_addr().unwrap());
|
|
|
|
let (stream, _) = listener.accept().await.unwrap();
|
|
let ws_stream = WsStream::new(accept_async(stream).await.unwrap());
|
|
let (read, write) = tokio::io::split(ws_stream);
|
|
|
|
let (service, socket) = LspService::new(|client|
|
|
Backend { client }
|
|
);
|
|
|
|
println!("Starting language server");
|
|
Server::new(read, write, socket).serve(service).await;
|
|
println!("Stopping language server");
|
|
println!("Quitting...")
|
|
}
|
|
|
|
async fn main_stdio(_: Args) {
|
|
let (stdin, stdout) = (tokio::io::stdin(), tokio::io::stdout());
|
|
|
|
let (service, socket) = LspService::new(|client|
|
|
Backend { client }
|
|
);
|
|
|
|
Server::new(stdin, stdout, socket).serve(service).await;
|
|
}
|