diff --git a/src/decoder.rs b/src/decoder.rs index 859798e..bb81e5a 100644 --- a/src/decoder.rs +++ b/src/decoder.rs @@ -18,14 +18,20 @@ pub fn try_read_magic>(bytes: &mut I) -> Result<(), DecodeE } fn try_read_u32>(bytes: &mut I) -> Result { - let mut res: u32 = 0; - let i = bytes.take(4) - .enumerate() - .reduce(|acc, (idx, val)| { - (0, 0) - }); + let mut repacker = || { + if let Some(next_byte) = bytes.next() { + return Result::::Ok(next_byte as u32); + } else { + return Err(DecodeError::EarlyIteratorExhaustion); + } + }; - Ok(res) + Ok( + (repacker()? << 24) + + (repacker()? << 16) + + (repacker()? << 8) + + (repacker()?) + ) } mod codec_utils { @@ -603,4 +609,21 @@ mod test { iters += 1; } } + + #[test] + fn test_try_read_u32() { + let input = [10u8, 200u8, 255u8, 1u8, 254u8, 123u8, 45u8]; + let expected = 180_944_641; + assert_eq!( + try_read_u32(&mut input.into_iter()).expect("Couldn't read u32 from byte array"), + expected + ); + + let too_short = [0u8]; + let expected = Result::::Err(DecodeError::EarlyIteratorExhaustion); + assert_eq!( + try_read_u32(&mut too_short.into_iter()), + expected + ); + } } \ No newline at end of file diff --git a/src/error.rs b/src/error.rs index 57b32c2..636e378 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,5 +1,5 @@ -#[derive(Debug)] +#[derive(Debug, PartialEq)] pub enum DecodeError { Magic, Channels,