Как я могу прочитать стандартный ввод neovim, используя ржавчину?

Я новичок в ржавчине и подумал, что смогу получить здесь помощь.

Я пытаюсь следовать руководству по созданию 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 после последней строки печати....

Какую библиотеку журналирования вы используете?

true equals false 11.05.2024 10:49

Я не использую библиотеку, а только свой собственный код. Я отредактировал вопрос, включив в него этот код.

Cristi 11.05.2024 11:54
Почему Python в конце концов умрет
Почему Python в конце концов умрет
Последние 20 лет были действительно хорошими для Python. Он прошел путь от "просто языка сценариев" до основного языка, используемого для написания...
1
2
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, согласно спецификации, между частью заголовка и частью контента находится пустая строка. Поэтому ожидается пустая строка после последней «строки печати...» (попробуйте изменить logger::print_logs(next_line, None).unwrap(); на print_logs2(format!("line: {}", next_line), None).unwrap();).

Причина, по которой json не печатается, заключается в том, что содержимое не заканчивается новой строкой. Читать нужно до тех пор, пока не будет прочитано ровно указанное количество байт (согласно заголовку Content-Length).

Другие вопросы по теме