chiark / gitweb /
mgmtchannel: Break out read_rmp
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 10 May 2021 00:51:27 +0000 (01:51 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 10 May 2021 00:51:27 +0000 (01:51 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/packetframe.rs
src/prelude.rs

index 28da9c3de5cd0e30cf280f2502ab86571ca441e6..40a7413459c6f38f9f3e64a8787c6e10ba601067 100644 (file)
@@ -268,10 +268,8 @@ impl<R:Read> FrameReader<R> {
   pub fn read_withbulk<'c,T>(&'c mut self) -> (T, ReadFrame<impl Read + 'c>)
   where T: DeserializeOwned + Debug
   {
-    use MgmtChannelReadError::*;
     let mut f = self.new_frame()?.ok_or(MgmtChannelReadError::EOF)?;
-    let r = rmp_serde::decode::from_read(&mut f);
-    let v = r.map_err(|e| Parse(format!("{}", &e)))?;
+    let v = f.read_rmp()?;
     trace!("read OK {:?}", &v);
     (v, f)
   }
@@ -284,6 +282,20 @@ impl<R:Read> FrameReader<R> {
   }
 }
 
+#[ext(pub, name=ReadExt)]
+impl<R: Read> R {
+  #[throws(MgmtChannelReadError)]
+  fn read_rmp<T>(&mut self) -> T
+  where T: DeserializeOwned,
+        R: Read
+  {
+    use MgmtChannelReadError as MCRE;
+    let r = rmp_serde::decode::from_read(self);
+    let v = r.map_err(|e| MCRE::Parse(format!("{}", &e)))?;
+    v
+  }
+}
+
 trait ReadOutput {
   fn copy_from_buf(&mut self, input: &[u8]) -> usize;
 }
index 0881e9db9b96077c1176555a99c9c39e24129c7e..00989747b02558c754fe6710b0bf605697cec90c 100644 (file)
@@ -144,6 +144,7 @@ pub use crate::nwtemplates;
 pub use crate::occultilks::*;
 pub use crate::organise;
 pub use crate::packetframe::{FrameReader, FrameWriter, ReadFrame, WriteFrame};
+pub use crate::packetframe::{ReadExt};
 pub use crate::pcaliases::*;
 pub use crate::pcrender::*;
 pub use crate::pieces::*;