From: Ian Jackson Date: Fri, 16 Apr 2021 22:53:59 +0000 (+0100) Subject: packetframe: Sort out MgmtChannelWriteError X-Git-Tag: otter-0.6.0~573 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=5b09022560aff178be5c581cf5bd2f68067d70b6;p=otter.git packetframe: Sort out MgmtChannelWriteError Signed-off-by: Ian Jackson --- diff --git a/src/mgmtchannel.rs b/src/mgmtchannel.rs index b91b3fbd..c3a7f97d 100644 --- a/src/mgmtchannel.rs +++ b/src/mgmtchannel.rs @@ -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 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>>, diff --git a/src/packetframe.rs b/src/packetframe.rs index 3211824c..6be227cd 100644 --- a/src/packetframe.rs +++ b/src/packetframe.rs @@ -206,9 +206,7 @@ impl FrameWriter { #[throws(MgmtChannelWriteError)] pub fn write_rmp(&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)? }