mod core;
mod jsonrpc;
mod kaiv_srv;
use anyhow::Result;
fn main() -> Result<()> {
let args: Vec<String> = std::env::args().skip(1).collect();
match args.first().map(String::as_str) {
Some("--kaivrpc") => {
let socket = args
.get(1)
.map(String::as_str)
.unwrap_or("/tmp/quarb-lsp.sock");
kaiv_srv::serve(socket)
}
Some("--version" | "-V") => {
println!("quarb-lsp {}", env!("CARGO_PKG_VERSION"));
Ok(())
}
Some(other) => {
eprintln!("quarb-lsp: unknown flag {other:?} (try --kaivrpc <socket>)");
std::process::exit(2);
}
None => jsonrpc::serve(),
}
}
#[cfg(test)]
mod tests {
use crate::kaiv_srv::answer;
#[test]
fn kaivrpc_complete_round_trip() {
let req = "\
.!kaiv
method=quarb-lsp/complete
/params::text=/cf/entry @| co
/params::line=0
/params::col=15
";
let out = answer(req.as_bytes());
assert!(out.contains("::status=ok"), "{out}");
assert!(out.contains("count"), "{out}");
assert!(out.ends_with("!int'::n=2\n") || out.contains("::n="), "{out}");
}
#[test]
fn kaivrpc_diagnostics_round_trip() {
let req = "\
.!kaiv
method=quarb-lsp/diagnostics
/params::text=/tags/* | rec(:::)
";
let out = answer(req.as_bytes());
assert!(out.contains("::status=ok"), "{out}");
assert!(out.contains("needs a key"), "{out}");
}
#[test]
fn unknown_method_is_a_clean_refusal() {
let req = ".!kaiv\nmethod=quarb-lsp/nope\n";
let out = answer(req.as_bytes());
assert!(out.contains("no-such-method"), "{out}");
}
}