MCPcopy Create free account
hub / github.com/ScriptedAlchemy/tracedecay / read_message

Function read_message

src/diagnostics/lsp/client.rs:382–425  ·  view source on GitHub ↗
(
    reader: &mut BufReader<tokio::process::ChildStdout>,
)

Source from the content-addressed store, hash-verified

380}
381
382async fn read_message(
383 reader: &mut BufReader<tokio::process::ChildStdout>,
384) -> Result<Option<JsonRpcMessage>> {
385 let mut content_length = None;
386 loop {
387 let mut line = String::new();
388 let bytes = reader
389 .read_line(&mut line)
390 .await
391 .map_err(|e| TraceDecayError::Config {
392 message: format!("failed to read LSP header: {e}"),
393 })?;
394 if bytes == 0 {
395 return Ok(None);
396 }
397 let trimmed = line.trim_end_matches(['\r', '\n']);
398 if trimmed.is_empty() {
399 break;
400 }
401 let Some((name, value)) = trimmed.split_once(':') else {
402 continue;
403 };
404 if name.eq_ignore_ascii_case("content-length") {
405 content_length = value.trim().parse::<usize>().ok();
406 }
407 }
408 let Some(length) = content_length else {
409 return Err(TraceDecayError::Config {
410 message: "LSP message missing Content-Length header".to_string(),
411 });
412 };
413 let mut body = vec![0_u8; length];
414 reader
415 .read_exact(&mut body)
416 .await
417 .map_err(|e| TraceDecayError::Config {
418 message: format!("failed to read LSP body: {e}"),
419 })?;
420 serde_json::from_slice(&body)
421 .map(Some)
422 .map_err(|e| TraceDecayError::Config {
423 message: format!("failed to parse LSP message: {e}"),
424 })
425}
426
427async fn read_message_until(
428 reader: &mut BufReader<tokio::process::ChildStdout>,

Callers 1

wait_for_initializeFunction · 0.70

Calls 2

read_lineMethod · 0.45
is_emptyMethod · 0.45

Tested by

no test coverage detected