From 43a1bbb57814046cb222be06aaae2eb5a00f7a67 Mon Sep 17 00:00:00 2001 From: Victorien Elvinger Date: Tue, 16 Sep 2025 09:59:43 +0200 Subject: [PATCH] [io] Add specialized read_exact and write_all for slices --- embedded-io-async/src/impls/slice_mut.rs | 9 +++++++++ embedded-io-async/src/impls/slice_ref.rs | 11 +++++++++++ embedded-io-async/src/impls/vec.rs | 6 ++++++ embedded-io/src/impls/slice_mut.rs | 9 +++++++++ embedded-io/src/impls/slice_ref.rs | 9 +++++++++ embedded-io/src/impls/vec.rs | 6 ++++++ 6 files changed, 50 insertions(+) diff --git a/embedded-io-async/src/impls/slice_mut.rs b/embedded-io-async/src/impls/slice_mut.rs index bd64d1320..fbbed187d 100644 --- a/embedded-io-async/src/impls/slice_mut.rs +++ b/embedded-io-async/src/impls/slice_mut.rs @@ -24,4 +24,13 @@ impl Write for &mut [u8] { *self = b; Ok(amt) } + + #[inline] + async fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> { + if self.len() < buf.len() { + return Err(SliceWriteError::Full); + } + self.write(buf).await?; + Ok(()) + } } diff --git a/embedded-io-async/src/impls/slice_ref.rs b/embedded-io-async/src/impls/slice_ref.rs index a6a4ba807..f49abbd62 100644 --- a/embedded-io-async/src/impls/slice_ref.rs +++ b/embedded-io-async/src/impls/slice_ref.rs @@ -22,6 +22,17 @@ impl Read for &[u8] { *self = b; Ok(amt) } + + async fn read_exact( + &mut self, + buf: &mut [u8], + ) -> Result<(), embedded_io::ReadExactError> { + if self.len() < buf.len() { + return Err(crate::ReadExactError::UnexpectedEof); + } + self.read(buf).await?; + Ok(()) + } } impl BufRead for &[u8] { diff --git a/embedded-io-async/src/impls/vec.rs b/embedded-io-async/src/impls/vec.rs index c24405e39..a9741f1e0 100644 --- a/embedded-io-async/src/impls/vec.rs +++ b/embedded-io-async/src/impls/vec.rs @@ -9,4 +9,10 @@ impl Write for Vec { self.extend_from_slice(buf); Ok(buf.len()) } + + #[inline] + async fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> { + self.write(buf).await?; + Ok(()) + } } diff --git a/embedded-io/src/impls/slice_mut.rs b/embedded-io/src/impls/slice_mut.rs index cee991ea6..86390652a 100644 --- a/embedded-io/src/impls/slice_mut.rs +++ b/embedded-io/src/impls/slice_mut.rs @@ -42,6 +42,15 @@ impl Write for &mut [u8] { Ok(amt) } + #[inline] + fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> { + if self.len() < buf.len() { + return Err(SliceWriteError::Full); + } + self.write(buf)?; + Ok(()) + } + #[inline] fn flush(&mut self) -> Result<(), Self::Error> { Ok(()) diff --git a/embedded-io/src/impls/slice_ref.rs b/embedded-io/src/impls/slice_ref.rs index 0270aca27..af928f9a8 100644 --- a/embedded-io/src/impls/slice_ref.rs +++ b/embedded-io/src/impls/slice_ref.rs @@ -26,6 +26,15 @@ impl Read for &[u8] { *self = b; Ok(amt) } + + #[inline] + fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), crate::ReadExactError> { + if self.len() < buf.len() { + return Err(crate::ReadExactError::UnexpectedEof); + } + self.read(buf)?; + Ok(()) + } } impl BufRead for &[u8] { diff --git a/embedded-io/src/impls/vec.rs b/embedded-io/src/impls/vec.rs index 3b279c564..d8fbb638b 100644 --- a/embedded-io/src/impls/vec.rs +++ b/embedded-io/src/impls/vec.rs @@ -14,6 +14,12 @@ impl Write for Vec { Ok(buf.len()) } + #[inline] + fn write_all(&mut self, buf: &[u8]) -> Result<(), Self::Error> { + self.write(buf)?; + Ok(()) + } + #[inline] fn flush(&mut self) -> Result<(), Self::Error> { Ok(())