chiark / gitweb /
mgmtchannel: Provide _withbulk
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 1 May 2021 14:57:51 +0000 (15:57 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 1 May 2021 14:57:51 +0000 (15:57 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/mgmtchannel.rs
src/prelude.rs

index a2fc2aa926b12fd4ed542c20f426dd3cd42f7425..2b763ca766fc628afeb8651911b2a688f7473232 100644 (file)
@@ -69,21 +69,41 @@ impl MgmtChannel {
   }
 
   #[throws(MgmtChannelReadError)]
-  pub fn read<T:DeserializeOwned+Debug>(&mut self) -> T {
+  pub fn read_withbulk<'c,T>(&'c mut self) -> (T, ReadFrame<impl Read + 'c>)
+  where T: DeserializeOwned + Debug
+  {
     use MgmtChannelReadError::*;
-    let f = self.read.new_frame()?.ok_or(MgmtChannelReadError::EOF)?;
-    let r = rmp_serde::decode::from_read(f);
+    let mut f = self.read.new_frame()?.ok_or(MgmtChannelReadError::EOF)?;
+    let r = rmp_serde::decode::from_read(&mut f);
     let v = r.map_err(|e| Parse(format!("{}", &e)))?;
     trace!("read OK {:?}", &v);
-    v
+    (v, f)
+  }
+
+  #[throws(MgmtChannelReadError)]
+  pub fn read<T>(&mut self) -> T
+  where T: DeserializeOwned + Debug
+  {
+    self.read_withbulk()?.0
   }
 
   #[throws(MgmtChannelWriteError)]
-  pub fn write<T:Serialize+Debug>(&mut self, val: &T) {
+  pub fn write_withbulk<'c,T>(&mut self, val: &T)
+                              -> WriteFrame<impl Write + 'c>
+  where T: Serialize + Debug
+  {
     let mut f = self.write.new_frame()?;
     rmp_serde::encode::write_named(&mut f, val)?;
+    trace!("writing {:?}", val);
+    f
+  }
+
+  #[throws(MgmtChannelWriteError)]
+  pub fn write<T>(&mut self, val: &T)
+  where T: Serialize + Debug
+  {
+    let f = self.write_withbulk(val)?;
     f.finish()?;
-    trace!("wrote OK {:?}", val);
   }
 
   #[throws(AE)]
index 6bc26c54c54c92e5664877a237ee97ac6dccb7ea..2ddd81969b30884e0123aff9c4f7713ccda036b2 100644 (file)
@@ -136,7 +136,7 @@ pub use crate::mgmtchannel::*;
 pub use crate::nwtemplates;
 pub use crate::occultilks::*;
 pub use crate::organise;
-pub use crate::packetframe::{FrameReader, FrameWriter};
+pub use crate::packetframe::{FrameReader, FrameWriter, ReadFrame, WriteFrame};
 pub use crate::pcaliases::*;
 pub use crate::pcrender::*;
 pub use crate::pieces::*;