basic_text_internals/
categorize.rs1use crate::unicode::SUB;
5use crate::{check_basic_text_char, BasicTextError};
6use std::cell::RefCell;
7use std::rc::Rc;
8
9pub struct Categorize<Iter: Iterator<Item = char>> {
10 iter: Iter,
11
12 error: Rc<RefCell<Option<BasicTextError>>>,
17}
18
19impl<Iter: Iterator<Item = char>> Categorize<Iter> {
20 #[inline]
21 pub fn new(iter: Iter, error: Rc<RefCell<Option<BasicTextError>>>) -> Self {
22 Self { iter, error }
23 }
24
25 #[cold]
26 fn record_error(&mut self, error: BasicTextError) -> char {
27 *self.error.borrow_mut() = Some(error);
28 SUB
29 }
30}
31
32impl<Iter: Iterator<Item = char>> Iterator for Categorize<Iter> {
33 type Item = char;
34
35 #[inline]
36 fn next(&mut self) -> Option<Self::Item> {
37 let c = self.iter.next()?;
38 Some(match check_basic_text_char(c) {
39 Ok(()) => c,
40 Err(e) => self.record_error(e),
41 })
42 }
43}