我正在try 将Rust Analyzer与基于浏览器的编辑器集成.

我的第一步是直接从终端运行Rust Analyzer,并通过stdio发送请求.

$ rust-analyzer
> Content-Length:207\r\n\r\n{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":null,"rootPath":"/mnt/78b33d24-344b-43da-a40c-8b81a6fd0b34/projects/rustexplorer/quick_test","initializationOptions":{},"capabilities":{}}}

但我有个错误:

[ERROR rust_analyzer] Unexpected error: expected initialize request, got Err(RecvError)
expected initialize request, got Err(RecvError)

我错过了什么?

推荐答案

这只是因为当您直接在终端中输入时,四个文字字符\ r \ n没有转换为两个特殊字符\r\n.

为了在终端中试验by hand,您应该变换行的结尾.

$ sed -u -re 's/^(.*)$/\1\r/' | rust-analyzer 
Content-Length: 207

{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":null,"rootPath":"/mnt/78b33d24-344b-43da-a40c-8b81a6fd0b34/projects/rustexplorer/quick_test","initializationOptions":{},"capabilities":{}}}

... then the response is displayed here ...

请注意,此处按Enter键;我们不try 输入\n特殊字符.

再想一想,我认为在这种情况下(交互式终端),您应该提供Content-Length: 209,因为json内容将以\r\n结尾(另外两个字节,作为分隔符忽略).

另一种解决方案是更改终端的设置.

$ stty -icrnl
$ rust-analyser
Content-Length: 208^M <-- Enter + control-J
^M <-- Enter + control-J
{"jsonrpc":"2.0", ... ,"capabilities":{}}} <-- control-J
... the response is displayed here ...

Rust相关问答推荐

如何将元素添加到向量并返回对该元素的引用?

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

MPSC频道在接收器处阻塞

交换引用时的生命周期

如何定义实现同名但返回类型不同的 struct 的函数

将serde_json读入`VEC<;T&>;`( rust 色)时出现问题

程序在频道RX上挂起

解析程序无法在Cargo 发布中 Select 依赖版本

对reqwest提供的这种嵌套JSON struct 进行反序列化

为什么不';t(&;mut-iter).take(n)取得iter的所有权?

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

`use` 和 `crate` 关键字在 Rust 项目中效果不佳

Rust 如何返回大类型(优化前)?

如何从borrow 的异步代码运行阻塞代码?

相当于 Rust 中 C++ 的 std::istringstream

Sized问题的动态调度迭代器Rust

Rust 中的自动取消引用是如何工作的?

只有一个字符被读入作为词法分析器的输入

将一片字节复制到一个大小不匹配的数组中

意外的正则表达式模式匹配