1use crate::{
2 decoder::{DecodeStatus, Decoder},
3 encoder::Encoder,
4 DecodeError,
5};
6
7#[derive(Debug, Clone, Copy)]
9pub struct EncodeIter<I> {
10 iter: I,
11 encoder: Encoder,
12}
13
14impl<I> EncodeIter<I> {
15 pub(crate) fn new(iter: I) -> Self {
16 Self {
17 iter,
18 encoder: Encoder::default(),
19 }
20 }
21
22 pub fn inner(&self) -> &I {
24 &self.iter
25 }
26
27 pub fn inner_mut(&mut self) -> &mut I {
29 &mut self.iter
30 }
31
32 pub fn into_inner(self) -> I {
34 self.iter
35 }
36}
37
38impl<I> Iterator for EncodeIter<I>
39where
40 I: Iterator<Item = u8>,
41{
42 type Item = char;
43
44 fn next(&mut self) -> Option<Self::Item> {
45 if let Some(encoded) = self.encoder.next() {
46 return Some(encoded);
47 }
48
49 let byte = self.iter.next()?;
50 let encoded = self.encoder.push(byte);
51 Some(encoded)
52 }
53}
54
55#[derive(Debug, Clone, Copy)]
57pub struct DecodeIter<I> {
58 iter: I,
59 decoder: Decoder,
60}
61
62impl<I> DecodeIter<I> {
63 pub(crate) fn new(iter: I) -> Self {
64 Self {
65 iter,
66 decoder: Decoder::default(),
67 }
68 }
69
70 pub fn inner(&self) -> &I {
72 &self.iter
73 }
74
75 pub fn inner_mut(&mut self) -> &mut I {
77 &mut self.iter
78 }
79
80 pub fn into_inner(self) -> I {
82 self.iter
83 }
84}
85
86impl<I> Iterator for DecodeIter<I>
87where
88 I: Iterator<Item = u8>,
89{
90 type Item = Result<u8, DecodeError>;
91
92 fn next(&mut self) -> Option<Self::Item> {
93 loop {
94 let next_byte = self.iter.next();
95 match self.decoder.push(next_byte) {
96 DecodeStatus::NeedMore => {}
97 DecodeStatus::Emit(result) => {
98 return result;
99 }
100 }
101 }
102 }
103}