kona_protocol/
iter.rs

1//! An iterator over encoded frames.
2
3use crate::frame::{DERIVATION_VERSION_0, Frame, FrameParseError};
4
5/// An iterator over encoded frames.
6#[derive(Debug, Clone)]
7pub struct FrameIter<'a> {
8    encoded: &'a [u8],
9    cursor: usize,
10}
11
12impl<'a> FrameIter<'a> {
13    /// Creates a new [FrameIter].
14    pub const fn new(encoded: &'a [u8]) -> Self {
15        Self { encoded, cursor: 1 }
16    }
17}
18
19impl<'a> From<&'a [u8]> for FrameIter<'a> {
20    fn from(encoded: &'a [u8]) -> Self {
21        Self::new(encoded)
22    }
23}
24
25impl Iterator for FrameIter<'_> {
26    type Item = Result<Frame, FrameParseError>;
27
28    fn next(&mut self) -> Option<Self::Item> {
29        if self.cursor >= self.encoded.len() {
30            return None;
31        }
32        if self.encoded[0] != DERIVATION_VERSION_0 {
33            return None;
34        }
35
36        let (new_start, frame) = Frame::parse_frame(self.encoded, self.cursor)
37            .map_err(FrameParseError::FrameDecodingError)
38            .ok()?;
39
40        self.cursor += new_start;
41        Some(Ok(frame))
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48    use alloc::{vec, vec::Vec};
49
50    #[test]
51    fn test_iterate_none() {
52        let bytes = Vec::new();
53        let mut iter = FrameIter::new(bytes.as_slice());
54        assert!(iter.next().is_none());
55    }
56
57    #[test]
58    fn test_iterate_missing_version() {
59        let bytes = vec![0x01, 0x02, 0x03, 0x04, 0x05];
60        let mut iter = FrameIter::new(bytes.as_slice());
61        assert!(iter.next().is_none());
62    }
63
64    #[test]
65    fn test_iterate_many_frames() {
66        let frame = Frame { id: [0xFF; 16], number: 0xEE, data: vec![0xDD; 50], is_last: true };
67        let mut bytes = Vec::new();
68        bytes.extend_from_slice(&[DERIVATION_VERSION_0]);
69        (0..5).for_each(|_| {
70            bytes.extend_from_slice(&frame.encode());
71        });
72
73        // Create a frame iterator from the bytes.
74        let mut iter = FrameIter::new(bytes.as_slice());
75
76        // Check that the iterator returns the same frame 5 times.
77        (0..5).for_each(|_| {
78            let next = iter.next().unwrap().unwrap();
79            assert_eq!(next, frame);
80        });
81    }
82}