前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【大家的项目】新弄了一个LSP服务的库

【大家的项目】新弄了一个LSP服务的库

作者头像
MikeLoveRust
发布2022-03-28 14:43:18
5730
发布2022-03-28 14:43:18
举报

前段时间在用 rust 实现 vscode 的 lsp 服务, 虽然 ra 已经开发出了相关库, 但用着不是很舒服, 所以我自己弄了一个 LSP 相关的组件.

目前包含2个库

  • lsp-ty LSP 规范中提到的类型, 这些都是 rust 原生类型, 没有任何 binding, 以及一些辅助 trait
  • lsp-io 提供从 tcpstream 或 stdio 等读写协议消息的包装.

目前仓库还提供了一个简单 demo, 包含 vscode 插件 和 lsp 实现.

相比于 ra 的用法, lsp-io 可以让你用类似 warp 组织路由的写法实现 LSP 服务, 以下代码来自 yaya-lsp

代码语言:javascript
复制
// 处理初始化请求, 这是 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))
})

实现效果如下

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-02-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档