bytes_iter/
lib.rs

1#![no_std]
2
3// TODO: can this be easily extended to support both endianesses?
4pub struct ByteReader<'a, T: Iterator<Item = &'a u8>>(T);
5
6impl<'a, T> ByteReader<'a, T>
7where
8    T: Iterator<Item = &'a u8>,
9{
10    pub fn new(iter: T) -> ByteReader<'a, T> {
11        ByteReader(iter)
12    }
13
14    pub fn next_u8(&mut self) -> Option<u8> {
15        self.0.next().map(|&x| x)
16    }
17
18    pub fn next_u16(&mut self) -> Option<u16> {
19        let first = self.next_u8()? as u16;
20        let second = self.next_u8()? as u16;
21
22        Some((second << 8) | first)
23    }
24
25    pub fn next_u32(&mut self) -> Option<u32> {
26        let first = self.next_u16()? as u32;
27        let second = self.next_u16()? as u32;
28
29        Some((second << 16) | first)
30    }
31
32    pub fn next_u64(&mut self) -> Option<u64> {
33        let first = self.next_u32()? as u64;
34        let second = self.next_u32()? as u64;
35
36        Some((second << 32) | first)
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use ByteReader;
43
44    #[test]
45    fn consume_slice() {
46        let slice = &[0x45, 0xf6, 0xde, 0x34, 0x98, 0x77];
47        let mut reader = ByteReader::new(slice.iter());
48        assert_eq!(reader.next_u8(), Some(0x45));
49        assert_eq!(reader.next_u32(), Some(0x98_34_de_f6));
50        assert_eq!(reader.next_u16(), None);
51    }
52}