diff --git a/src/done.rs b/src/done.rs index f81507c..6cdf2db 100644 --- a/src/done.rs +++ b/src/done.rs @@ -100,6 +100,7 @@ impl Emitable for DoneMessage { impl<'buffer, T: AsRef<[u8]> + 'buffer> Parseable> for DoneMessage { + type Error = DecodeError; fn parse(buf: &DoneBuffer<&'buffer T>) -> Result { Ok(DoneMessage { code: buf.code(), diff --git a/src/error.rs b/src/error.rs index f7951f7..ea6b84d 100644 --- a/src/error.rs +++ b/src/error.rs @@ -118,6 +118,7 @@ impl Emitable for ErrorMessage { impl<'buffer, T: AsRef<[u8]> + 'buffer> Parseable> for ErrorMessage { + type Error = DecodeError; fn parse( buf: &ErrorBuffer<&'buffer T>, ) -> Result { diff --git a/src/header.rs b/src/header.rs index 22e2445..2f882ea 100644 --- a/src/header.rs +++ b/src/header.rs @@ -57,6 +57,7 @@ impl Emitable for NetlinkHeader { impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> for NetlinkHeader { + type Error = DecodeError; fn parse(buf: &NetlinkBuffer<&'a T>) -> Result { Ok(NetlinkHeader { length: buf.length(), diff --git a/src/message.rs b/src/message.rs index 4bc7dda..33319d6 100644 --- a/src/message.rs +++ b/src/message.rs @@ -37,6 +37,7 @@ impl NetlinkMessage { impl NetlinkMessage where I: NetlinkDeserializable, + I::Error: Into, { /// Parse the given buffer as a netlink message pub fn deserialize(buffer: &[u8]) -> Result { @@ -87,7 +88,9 @@ impl<'buffer, B, I> Parseable> for NetlinkMessage where B: AsRef<[u8]> + 'buffer, I: NetlinkDeserializable, + I::Error:Into, { + type Error = DecodeError; fn parse(buf: &NetlinkBuffer<&'buffer B>) -> Result { use self::NetlinkPayload::*; @@ -100,21 +103,23 @@ where NLMSG_ERROR => { let msg = ErrorBuffer::new_checked(&bytes) .and_then(|buf| ErrorMessage::parse(&buf)) - .context("failed to parse NLMSG_ERROR")?; + .map_err(|err|DecodeError::FailedToParseNlMsgError(err.into()))?; Error(msg) } NLMSG_NOOP => Noop, NLMSG_DONE => { let msg = DoneBuffer::new_checked(&bytes) .and_then(|buf| DoneMessage::parse(&buf)) - .context("failed to parse NLMSG_DONE")?; + .map_err(|err| DecodeError::FailedToParseNlMsgDone(err.into()))?; Done(msg) } NLMSG_OVERRUN => Overrun(bytes.to_vec()), message_type => { - let inner_msg = I::deserialize(&header, bytes).context( - format!("Failed to parse message with type {message_type}"), - )?; + let inner_msg = I::deserialize(&header, bytes) + .map_err(|err| DecodeError::FailedToParseMessageWithType { + message_type, + source: Box::new(err.into()), + })?; InnerMessage(inner_msg) } };