const LONGEST_ESCAPE : usize = 6;
#[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
pub struct Escape<I: Iterator<Item=u8>> {
inner: I,
buffer: u64
}
impl<I: Iterator<Item=u8>> Escape<I> {
pub fn new(i: I) -> Escape<I> {
Escape {
inner: i,
buffer: 0
}
}
}
impl<I: Iterator<Item=u8>> Iterator for Escape<I> {
type Item = u8;
fn next(&mut self) -> Option<u8> {
if self.buffer != 0 {
let ret = Some(self.buffer as u8);
self.buffer >>= 8;
ret
} else if let Some(ch) = self.inner.next() {
self.buffer = match ch {
b'&' => 0x3b_70_6d_61, b'>' => 0x3b_74_67, b'<' => 0x3b_74_6c, b'"' => 0x3b_34_33_23, b'\'' => 0x3b_39_33_23, b'`' => 0x3b_36_39_23, b'!' => 0x3b_33_33_23, b'$' => 0x3b_36_33_23, b'%' => 0x3b_37_33_23, b'(' => 0x3b_30_34_23, b')' => 0x3b_31_34_23, b'+' => 0x3b_33_34_23, b'=' => 0x3b_31_36_23, b'@' => 0x3b_34_36_23, b'[' => 0x3b_31_39_23, b']' => 0x3b_33_39_23, b'{' => 0x3b_33_32_31_23, b'}' => 0x3b_35_32_31_23, _ => return Some(ch)
};
Some(b'&')
} else {
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let (l, u) = self.inner.size_hint();
(l, if let Some(u_) = u {u_.checked_mul(LONGEST_ESCAPE)} else {None})
}
}