use rez_lsp_server::server::RezLanguageServer;
use std::env;
use tower_lsp::{LspService, Server};
#[tokio::main]
async fn main() {
tracing_subscriber::fmt()
.with_writer(std::io::stderr)
.with_target(false) .with_thread_ids(false) .with_level(true) .compact() .init();
let args: Vec<String> = env::args().collect();
if args.len() > 1 {
match args[1].as_str() {
"--help" | "-h" => {
print_help();
return;
}
"--version" | "-V" => {
print_version();
return;
}
"--stdio" => {
tracing::info!("Starting in stdio mode (LSP)");
}
_ => {
eprintln!("Unknown argument: {}", args[1]);
print_help();
std::process::exit(1);
}
}
}
tracing::info!(
"Rez LSP Server {} starting in LSP mode...",
env!("CARGO_PKG_VERSION")
);
let stdin = tokio::io::stdin();
let stdout = tokio::io::stdout();
let (service, socket) = LspService::new(RezLanguageServer::new);
Server::new(stdin, stdout, socket).serve(service).await;
}
fn print_help() {
println!("Rez LSP Server {}", env!("CARGO_PKG_VERSION"));
println!("Language Server Protocol implementation for Rez package management");
println!();
println!("USAGE:");
println!(" rez-lsp-server [OPTIONS]");
println!();
println!("OPTIONS:");
println!(" -h, --help Print this help message and exit");
println!(" -V, --version Print version information and exit");
println!(" --stdio Start LSP server (default mode)");
println!();
println!("DESCRIPTION:");
println!(" When run without arguments, starts the LSP server and communicates");
println!(" via stdin/stdout using the Language Server Protocol.");
println!();
println!(" This server provides language support for Rez package files:");
println!(" - Code completion for Rez functions and variables");
println!(" - Hover information for Rez keywords");
println!(" - Syntax validation and diagnostics");
println!(" - Go to definition for package dependencies");
}
fn print_version() {
println!("rez-lsp-server {}", env!("CARGO_PKG_VERSION"));
}