我对 Rust 还很陌生,我想我可以在这里得到一些帮助。
我正在尝试遵循 TJ DeVries 的关于制作 LSP 的指南,他正在用 Go 进行编码,但我正在尝试遵循 Rust。我被困在他从 neovim 的标准输出读取输入的部分。 Neovim 应该将 JSON-RPC 消息发送到我程序的标准输入。现在我想做的就是阅读我从 neovim 获得的内容并将其打印到文件中。
我已经设置了一个记录器,它所做的只是将文本添加到日志文件中,并且程序在打开 neovim 文件时运行。
根据我的理解,我应该读取 neovim 在 stdin 中抛出的任何内容,直到程序关闭,但我似乎无法读取 neovim 的所有 JSON RPC 消息(我只获取内容长度部分)。
这是main.rs中的代码:
fn main() {
let stdin_lock = io::stdin().lock();
let mut lines = stdin_lock.lines();
loop {
let next_line = match lines.next() {
Some(val) => val,
None => {
continue;
}
}
.unwrap();
logger::print_logs(String::from("printing line..."), None).unwrap();
logger::print_logs(next_line, None).unwrap();
}
}
记录器.rs:
pub fn print_logs(message: String, file_name: Option<&str>) -> std::io::Result<()> {
fs::create_dir_all(LOGS_FOLDER)?;
let file_name = file_name.unwrap_or(DEFAULT_LOGS_FILE);
let file_location = format!("{}/{}", LOGS_FOLDER, file_name);
let file_contents = read_to_string(file_location.clone()).unwrap();
let mut file = File::create(file_location)?;
let full_message = format!("{}\n{}", file_contents, message);
file.write_all(&full_message.into_bytes())?;
Ok(())
}
这是我的日志文件中的输出:
printing line...
Content-Length: 3085
printing line...
我希望这个文件在最后一个打印行之后也有一个 JSON....
首先,根据规范,标题部分和内容部分之间有一个空行。因此,最后一个“打印行...”之后的空行是预期的(尝试将
logger::print_logs(next_line, None).unwrap();
更改为 print_logs2(format!("line: {}", next_line), None).unwrap();
)
没有打印json的原因是内容没有以换行符结尾。您需要读取,直到读取到指定的字节数(根据
Content-Length
标头)。