首页 > 数据库 > 数据库开发技术 > 【大家的项目】新弄了一个LSP服务的库
// 处理初始化请求, 这是 LSP 协议中客户端发送第一个请求, 包含了客户端的能力和一些配置
InitializeParams::on_req(req, self, |server, id, _| {
let ret = InitializeResult {
capabilities: ServerCapabilities {
completion_provider: Some(CompletionOptions {
all_commit_characters: None,
resolve_provider: None,
trigger_characters: Some(vec!["$".to_string()]),
work_done_progress: None,
}),
..Default::default()
},
server_info: Some(InitializeResultServerInfo {
name: "yaya-server".to_string(),
version: Some("0.0.1".to_string()),
}),
};
server.resp(id.ok_resp(ret))
})
// handle 函数返回为 OneOf<Ok_type, RequestMessage>
// 即成功或method不匹配之后继续向下传递的原始请求, 可以使用 map_or
// 组合函数继续处理
// 这里我们提供一个简单的补全能力.
.map_or(|req| {
CompletionParams::on_req(req, self, |server, id, _| {
let ret = CompletionItem {
label: "demo".to_string(),
detail: Some("that's ok".to_string()),
insert_text: Some("yaya".to_string()),
kind: Some(CompletionItemKind::Keyword),
..Default::default()
};
server.resp(id.ok_resp(vec![ret]))
})
})
// 客户端发送关闭请求时关闭当前连接
.flat_or_map_or(|req| {
ShutdownParams::on_req(req, self, |server, id, _| {
server.terminated = true;
tracing::info!("shutting down...");
server.resp(id.ok_resp(Empty {}))
})
})
.flat_or()
.unify(|req| {
tracing::warn!("unhandled request {:#?}", req);
self.resp(req.id.ok_resp(serde_json::Value::Null))
})

原文作者:Rust语言中文社区;如有侵权,请联系管理员删除。