chiark / gitweb /
packetframe: Provide write_rmp
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 16 Apr 2021 21:38:35 +0000 (22:38 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 23 Apr 2021 18:32:07 +0000 (19:32 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/mgmtchannel.rs
src/packetframe.rs

index edb578be4a328783328bd8dfba18616dabcddb44..b91b3fbd403b47b8fa209535744eabd50c1e242b 100644 (file)
@@ -13,6 +13,8 @@ pub enum MgmtChannelReadError {
 }
 display_as_debug!{MgmtChannelReadError}
 
+pub type MgmtChannelWriteError = rmp_serde::encode::Error;
+
 pub struct MgmtChannel {
   read: io::Lines<BufReader<Box<dyn Read>>>,
   write: BufWriter<Box<dyn Write>>,
index d96cefc07ab8b4b41285bf62ba930d56cd86db7f..3211824c1a947eb5daf2362e0baaa8e4a1cabb96 100644 (file)
@@ -22,7 +22,7 @@ const CHUNK_DEF: u16 = 8192;
 type BO = BigEndian;
 
 #[derive(Debug)]
-struct Fuse<RW>(Result<RW, Broken>);
+pub struct Fuse<RW>(Result<RW, Broken>);
 
 #[derive(Debug)]
 pub struct FrameReader<R: BufRead> {
@@ -62,12 +62,12 @@ pub struct Broken {
 
 impl<RW> Fuse<RW> {
   #[throws(io::Error)]
-  fn get(&mut self) -> &mut RW {
+  pub fn get(&mut self) -> &mut RW {
     self.0.as_mut().map_err(|broken| broken.clone())?
   }
 
   #[throws(io::Error)]
-  fn with<F,T>(&mut self, f: F) -> T
+  pub fn with<F,T>(&mut self, f: F) -> T
     where F: FnOnce(&mut RW) -> Result<T, io::Error>
   {
     let inner = self.get()?;
@@ -204,6 +204,14 @@ impl<W:Write> FrameWriter<W> {
     self.inner.flush()?;
   }
 
+  #[throws(MgmtChannelWriteError)]
+  pub fn write_rmp<T:Serialize>(&mut self, t: &T) {
+    let mut frame = self.new_frame()
+      .map_err(|e| rmp_serde::encode::Error::InvalidValueWrite(
+        rmp::encode::ValueWriteError::InvalidMarkerWrite(e)))?;
+    rmp_serde::encode::write_named(&mut frame, t)?
+  }
+
   #[throws(io::Error)]
   fn tidy(&mut self) {
     self.finish_any_frame(Err(SenderError))?;