diff --git a/ciborium-io/src/lib.rs b/ciborium-io/src/lib.rs index f5f1f23..61b96f0 100644 --- a/ciborium-io/src/lib.rs +++ b/ciborium-io/src/lib.rs @@ -152,6 +152,19 @@ impl Write for &mut [u8] { } } +#[cfg(not(feature = "std"))] +impl Read for &mut [u8] { + type Error = EndOfFile; + + #[inline] + fn read_exact(&mut self, data: &mut [u8]) -> Result<(), Self::Error> { + let mut immutable: &[u8] = self; + immutable.read_exact(data)?; + *self = &mut core::mem::take(self)[data.len()..]; + Ok(()) + } +} + #[cfg(all(not(feature = "std"), feature = "alloc"))] impl Write for alloc::vec::Vec { type Error = core::convert::Infallible; @@ -205,6 +218,20 @@ mod test { reader.read_exact(&mut buffer[..]).unwrap_err(); } + #[test] + fn read_mut_two() { + let mut reader = &mut [1u8; 2][..]; + let mut buffer = [0u8; 1]; + + reader.read_exact(&mut buffer[..]).unwrap(); + assert_eq!(buffer[0], 1); + + reader.read_exact(&mut buffer[..]).unwrap(); + assert_eq!(buffer[0], 1); + + reader.read_exact(&mut buffer[..]).unwrap_err(); + } + #[test] #[cfg(feature = "std")] fn read_std() {