From 51bac32e28fcce754172abae74266ec46f19189f Mon Sep 17 00:00:00 2001 From: Brian Bosak Date: Tue, 23 Apr 2024 20:20:44 -0500 Subject: [PATCH] Add error types --- src/buffer.rs | 1 + src/inet/nlas.rs | 3 +++ src/inet/request.rs | 1 + src/inet/response.rs | 5 ++++- src/inet/socket_id.rs | 1 + src/unix/nlas.rs | 3 +++ src/unix/request.rs | 1 + src/unix/response.rs | 5 ++++- 8 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/buffer.rs b/src/buffer.rs index 5c07e1a..043145c 100644 --- a/src/buffer.rs +++ b/src/buffer.rs @@ -60,6 +60,7 @@ impl<'a, T: AsRef<[u8]> + AsMut<[u8]> + ?Sized> SockDiagBuffer<&'a mut T> { impl<'a, T: AsRef<[u8]>> ParseableParametrized, u16> for SockDiagMessage { + type Error = DecodeError; fn parse_with_param( buf: &SockDiagBuffer<&'a T>, message_type: u16, diff --git a/src/inet/nlas.rs b/src/inet/nlas.rs index 66f518b..9c22a57 100644 --- a/src/inet/nlas.rs +++ b/src/inet/nlas.rs @@ -38,6 +38,7 @@ pub struct LegacyMemInfo { } impl> Parseable> for LegacyMemInfo { + type Error = DecodeError; fn parse(buf: &LegacyMemInfoBuffer) -> Result { Ok(Self { receive_queue: buf.receive_queue(), @@ -184,6 +185,7 @@ pub struct MemInfo { } impl> Parseable> for MemInfo { + type Error = DecodeError; fn parse(buf: &MemInfoBuffer) -> Result { Ok(Self { receive_queue: buf.receive_queue(), @@ -314,6 +316,7 @@ impl nla::Nla for Nla { } impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> for Nla { + type Error = DecodeError; fn parse(buf: &NlaBuffer<&'a T>) -> Result { let payload = buf.value(); Ok(match buf.kind() { diff --git a/src/inet/request.rs b/src/inet/request.rs index 6eb1623..af65302 100644 --- a/src/inet/request.rs +++ b/src/inet/request.rs @@ -111,6 +111,7 @@ bitflags! { impl<'a, T: AsRef<[u8]> + 'a> Parseable> for InetRequest { + type Error = DecodeError; fn parse(buf: &InetRequestBuffer<&'a T>) -> Result { let err = "invalid socket_id value"; let socket_id = SocketId::parse_with_param( diff --git a/src/inet/response.rs b/src/inet/response.rs index 0b569a0..e8ebad4 100644 --- a/src/inet/response.rs +++ b/src/inet/response.rs @@ -77,6 +77,7 @@ pub struct InetResponseHeader { impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> for InetResponseHeader { + type Error = DecodeError; fn parse(buf: &InetResponseBuffer<&'a T>) -> Result { let err = "invalid socket_id value"; let socket_id = SocketId::parse_with_param( @@ -170,13 +171,14 @@ impl<'a, T: AsRef<[u8]> + ?Sized> InetResponseBuffer<&'a T> { pub fn nlas( &self, ) -> impl Iterator, DecodeError>> { - NlasIterator::new(self.payload()) + NlasIterator::new(self.payload()).map(|res| res.map_err(Into::into)) } } impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> for SmallVec<[Nla; 8]> { + type Error = DecodeError; fn parse(buf: &InetResponseBuffer<&'a T>) -> Result { let mut nlas = smallvec![]; for nla_buf in buf.nlas() { @@ -189,6 +191,7 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> for InetResponse { + type Error = DecodeError; fn parse(buf: &InetResponseBuffer<&'a T>) -> Result { let header = InetResponseHeader::parse(buf) .context("failed to parse inet response header")?; diff --git a/src/inet/socket_id.rs b/src/inet/socket_id.rs index 60ace9c..4c225c1 100644 --- a/src/inet/socket_id.rs +++ b/src/inet/socket_id.rs @@ -67,6 +67,7 @@ impl SocketId { impl<'a, T: AsRef<[u8]> + 'a> ParseableParametrized, u8> for SocketId { + type Error = DecodeError; fn parse_with_param( buf: &SocketIdBuffer<&'a T>, af: u8, diff --git a/src/unix/nlas.rs b/src/unix/nlas.rs index bfbb33a..11ef404 100644 --- a/src/unix/nlas.rs +++ b/src/unix/nlas.rs @@ -81,6 +81,7 @@ pub struct Vfs { } impl> Parseable> for Vfs { + type Error = DecodeError; fn parse(buf: &VfsBuffer) -> Result { Ok(Self { inode: buf.inode(), @@ -214,6 +215,7 @@ pub struct MemInfo { } impl> Parseable> for MemInfo { + type Error = DecodeError; fn parse(buf: &MemInfoBuffer) -> Result { Ok(Self { so_rcvbuf: buf.so_rcvbuf(), @@ -298,6 +300,7 @@ impl nla::Nla for Nla { } impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> for Nla { + type Error = DecodeError; fn parse(buf: &NlaBuffer<&'a T>) -> Result { let payload = buf.value(); Ok(match buf.kind() { diff --git a/src/unix/request.rs b/src/unix/request.rs index afc14c3..cb6e84d 100644 --- a/src/unix/request.rs +++ b/src/unix/request.rs @@ -88,6 +88,7 @@ bitflags! { impl<'a, T: AsRef<[u8]> + 'a> Parseable> for UnixRequest { + type Error = DecodeError; fn parse(buf: &UnixRequestBuffer<&'a T>) -> Result { Ok(Self { state_flags: StateFlags::from_bits_truncate(buf.state_flags()), diff --git a/src/unix/response.rs b/src/unix/response.rs index e5eb8d8..ecccad8 100644 --- a/src/unix/response.rs +++ b/src/unix/response.rs @@ -47,6 +47,7 @@ pub struct UnixResponseHeader { impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> for UnixResponseHeader { + type Error = DecodeError; fn parse(buf: &UnixResponseBuffer<&'a T>) -> Result { Ok(Self { kind: buf.kind(), @@ -187,13 +188,14 @@ impl<'a, T: AsRef<[u8]> + ?Sized> UnixResponseBuffer<&'a T> { pub fn nlas( &self, ) -> impl Iterator, DecodeError>> { - NlasIterator::new(self.payload()) + NlasIterator::new(self.payload()).map(|nla| nla.map_err(Into::into)) } } impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> for SmallVec<[Nla; 8]> { + type Error = DecodeError; fn parse(buf: &UnixResponseBuffer<&'a T>) -> Result { let mut nlas = smallvec![]; for nla_buf in buf.nlas() { @@ -206,6 +208,7 @@ impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> impl<'a, T: AsRef<[u8]> + ?Sized> Parseable> for UnixResponse { + type Error = DecodeError; fn parse(buf: &UnixResponseBuffer<&'a T>) -> Result { let header = UnixResponseHeader::parse(buf) .context("failed to parse inet response header")?;