chiark / gitweb /
packetframe: Sort out MgmtChannelWriteError
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 16 Apr 2021 22:53:59 +0000 (23:53 +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 b91b3fbd403b47b8fa209535744eabd50c1e242b..c3a7f97db581841c9f5b8daa4f5246704d54d7d0 100644 (file)
@@ -13,7 +13,26 @@ pub enum MgmtChannelReadError {
 }
 display_as_debug!{MgmtChannelReadError}
 
-pub type MgmtChannelWriteError = rmp_serde::encode::Error;
+#[derive(Debug,Error)]
+pub enum MgmtChannelWriteError {
+  Serialize(rmp_serde::encode::Error), // but not ValueWriteError so no from
+  IO(#[from] io::Error),
+}
+display_as_debug!{MgmtChannelWriteError}
+
+impl From<rmp_serde::encode::Error> for MgmtChannelWriteError {
+  fn from(re: rmp_serde::encode::Error) -> MgmtChannelWriteError {
+    use rmp_serde::encode::Error::*;
+    use MgmtChannelWriteError as MCWE;
+    use rmp::encode::ValueWriteError as RVWE;
+    match re {
+      InvalidValueWrite(RVWE::InvalidMarkerWrite(ioe)) => MCWE::IO(ioe),
+      InvalidValueWrite(RVWE::InvalidDataWrite  (ioe)) => MCWE::IO(ioe),
+      ser@ (UnknownLength | InvalidDataModel(_) |
+            DepthLimitExceeded | Syntax(_)) => MCWE::Serialize(ser),
+    }
+  }
+}
 
 pub struct MgmtChannel {
   read: io::Lines<BufReader<Box<dyn Read>>>,
index 3211824c1a947eb5daf2362e0baaa8e4a1cabb96..6be227cd14822ca34ecdaa10c0f0e6b2a9619e48 100644 (file)
@@ -206,9 +206,7 @@ impl<W:Write> FrameWriter<W> {
 
   #[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)))?;
+    let mut frame = self.new_frame()?;
     rmp_serde::encode::write_named(&mut frame, t)?
   }