openquest/openquest-lsp/src/main.rs

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