1use crate::frame::{DERIVATION_VERSION_0, Frame, FrameParseError};
4
5#[derive(Debug, Clone)]
7pub struct FrameIter<'a> {
8 encoded: &'a [u8],
9 cursor: usize,
10}
11
12impl<'a> FrameIter<'a> {
13 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 let mut iter = FrameIter::new(bytes.as_slice());
75
76 (0..5).for_each(|_| {
78 let next = iter.next().unwrap().unwrap();
79 assert_eq!(next, frame);
80 });
81 }
82}