use std::future::Future;
use tracing::{debug, info, warn};
use crate::client::WireClient;
use crate::error::WireError;
use crate::message::{parse_wire_message, WireMessage};
#[derive(Debug)]
pub struct WireResponse {
pub id: String,
pub result: serde_json::Value,
}
pub async fn process_messages<C, F, Fut>(client: &mut C, mut handler: F) -> Result<(), WireError>
where
C: WireClient,
F: FnMut(WireMessage) -> Fut,
Fut: Future<Output = Result<Option<WireResponse>, WireError>>,
{
info!("starting process_messages loop");
loop {
let raw = match client.read_raw_message().await {
Ok(msg) => msg,
Err(e) => {
warn!(error = %e, "Wire message error, exiting loop");
break;
}
};
let msg = match parse_wire_message(raw) {
Ok(msg) => {
debug!("parsed wire message");
msg
}
Err(e) => {
warn!(error = %e, "Failed to parse wire message, skipping");
continue;
}
};
if let Some(response) = handler(msg).await? {
client.send_response(&response.id, &response.result).await?;
}
}
info!("process_messages loop exited");
Ok(())
}