Я новичок в ржавчине и подумал, что смогу получить здесь помощь.
Я пытаюсь следовать руководству по созданию LSP от TJ DeVries, он пишет его на Go, но я пытаюсь следовать инструкциям на Rust. Я застрял на той части, где он читает данные из стандартного вывода neovim. Neovim должен отправлять сообщения JSON-RPC на стандартный ввод моей программы. Сейчас все, что я пытаюсь сделать, это прочитать то, что я получаю от neovim, и распечатать это в файл.
У меня уже настроен логгер, он только добавляет текст в файл журнала, и программа запускается при открытии файла neovim.
Насколько я понимаю, я должен читать все, что neovim выдает в стандартный ввод, пока программа не закроется, но я не могу прочитать все сообщения JSON RPC от neovim (я получаю только часть Content-Length).
Это код в 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();
}
}
logger.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).
Какую библиотеку журналирования вы используете?