use std::io::{self};
mod diagnostics;
mod jsonrpc;
fn main() {
let stdin = io::stdin();
let stdout = io::stdout();
let mut stdin = stdin.lock();
let mut stdout = stdout.lock();
while let Some(msg) = jsonrpc::read_message(&mut stdin) {
if let Some(response) = handle_message(&msg) {
jsonrpc::write_message(&mut stdout, &response);
}
}
}
fn handle_message(msg: &serde_json::Value) -> Option<serde_json::Value> {
let method = msg.get("method")?.as_str()?;
let id = msg.get("id");
match method {
"initialize" => Some(jsonrpc::success_response(
id,
serde_json::json!({
"capabilities": {
"textDocumentSync": 1, "diagnosticProvider": true,
},
"serverInfo": {
"name": "enprot-lsp",
"version": env!("CARGO_PKG_VERSION"),
}
}),
)),
"initialized" => None, "shutdown" => Some(jsonrpc::success_response(id, serde_json::json!(null))),
"textDocument/didOpen" => {
None
}
"textDocument/didChange" => None,
"textDocument/diagnostics" => {
let uri = msg
.pointer("/params/textDocument/uri")
.and_then(|v| v.as_str())
.unwrap_or("");
let text = msg
.pointer("/params/textDocument/text")
.and_then(|v| v.as_str())
.unwrap_or("");
let diags = diagnostics::check_plaintext_in_begin(uri, text);
Some(jsonrpc::success_response(id, serde_json::json!(diags)))
}
_ => Some(jsonrpc::error_response(
id,
-32601,
&format!("method not found: {method}"),
)),
}
}