Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-api/src/legacy_protocol.rs')
-rw-r--r--crates/proc-macro-api/src/legacy_protocol.rs38
1 files changed, 37 insertions, 1 deletions
diff --git a/crates/proc-macro-api/src/legacy_protocol.rs b/crates/proc-macro-api/src/legacy_protocol.rs
index 0a72052cc5..5d590520c8 100644
--- a/crates/proc-macro-api/src/legacy_protocol.rs
+++ b/crates/proc-macro-api/src/legacy_protocol.rs
@@ -2,6 +2,7 @@
pub mod json;
pub mod msg;
+pub mod postcard_wire;
use std::{
io::{BufRead, Write},
@@ -151,7 +152,11 @@ fn send_task(srv: &ProcMacroServerProcess, req: Request) -> Result<Response, Ser
return Err(server_error.clone());
}
- srv.send_task(send_request, req)
+ if srv.use_postcard() {
+ srv.send_task_bin(send_request_postcard, req)
+ } else {
+ srv.send_task(send_request, req)
+ }
}
/// Sends a request to the server and reads the response.
@@ -171,3 +176,34 @@ fn send_request(
})?;
Ok(res)
}
+
+fn send_request_postcard(
+ mut writer: &mut dyn Write,
+ mut reader: &mut dyn BufRead,
+ req: Request,
+ buf: &mut Vec<u8>,
+) -> Result<Option<Response>, ServerError> {
+ let bytes = postcard_wire::encode_cobs(&req)
+ .map_err(|_| ServerError { message: "failed to write request".into(), io: None })?;
+
+ postcard_wire::write_postcard(&mut writer, &bytes).map_err(|err| ServerError {
+ message: "failed to write request".into(),
+ io: Some(Arc::new(err)),
+ })?;
+
+ let frame = postcard_wire::read_postcard(&mut reader, buf).map_err(|err| ServerError {
+ message: "failed to read response".into(),
+ io: Some(Arc::new(err)),
+ })?;
+
+ match frame {
+ None => Ok(None),
+ Some(bytes) => {
+ let resp: Response = postcard_wire::decode_cobs(bytes).map_err(|e| ServerError {
+ message: format!("failed to decode message: {e}"),
+ io: None,
+ })?;
+ Ok(Some(resp))
+ }
+ }
+}