Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/proc-macro-api/src/transport/codec/postcard.rs')
| -rw-r--r-- | crates/proc-macro-api/src/transport/codec/postcard.rs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/crates/proc-macro-api/src/transport/codec/postcard.rs b/crates/proc-macro-api/src/transport/codec/postcard.rs new file mode 100644 index 0000000000..6f5319e75b --- /dev/null +++ b/crates/proc-macro-api/src/transport/codec/postcard.rs @@ -0,0 +1,40 @@ +//! Postcard encode and decode implementations. + +use std::io::{self, BufRead, Write}; + +use serde::{Serialize, de::DeserializeOwned}; + +use crate::{Codec, transport::framing::Framing}; + +pub struct PostcardProtocol; + +impl Framing for PostcardProtocol { + type Buf = Vec<u8>; + + fn read<'a, R: BufRead + ?Sized>( + inp: &mut R, + buf: &'a mut Vec<u8>, + ) -> io::Result<Option<&'a mut Vec<u8>>> { + buf.clear(); + let n = inp.read_until(0, buf)?; + if n == 0 { + return Ok(None); + } + Ok(Some(buf)) + } + + fn write<W: Write + ?Sized>(out: &mut W, buf: &Vec<u8>) -> io::Result<()> { + out.write_all(buf)?; + out.flush() + } +} + +impl Codec for PostcardProtocol { + fn encode<T: Serialize>(msg: &T) -> io::Result<Vec<u8>> { + postcard::to_allocvec_cobs(msg).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e)) + } + + fn decode<T: DeserializeOwned>(buf: &mut Self::Buf) -> io::Result<T> { + postcard::from_bytes_cobs(buf).map_err(|e| io::Error::new(io::ErrorKind::InvalidData, e)) + } +} |