rspack_style/style_core/
scan.rs

1use crate::extend::vec_str::VecCharExtend;
2
3pub type CharWord<'a> = (Option<&'a char>, &'a char, Option<&'a char>);
4pub type ScanArg<'a> = (&'a mut usize, &'a mut Vec<char>, &'a mut bool);
5
6///
7/// 遍历
8///
9#[inline]
10pub fn traversal(
11  arg_start: Option<usize>,
12  charlist: &[char],
13  exec: &mut dyn for<'a> FnMut(ScanArg<'a>, CharWord) -> Result<(), String>,
14) -> Result<(String, usize), String> {
15  let mut index = arg_start.unwrap_or(0);
16  let mut temp: Vec<char> = Vec::with_capacity(charlist.len());
17  let mut hasend = false;
18
19  while index < charlist.len() {
20    let prevchar = if index == 0 {
21      None
22    } else {
23      charlist.get(index - 1)
24    };
25    let char = charlist.get(index).unwrap();
26    let nextchar = if index + 1 < charlist.len() {
27      charlist.get(index + 1)
28    } else {
29      None
30    };
31    exec(
32      (&mut index, &mut temp, &mut hasend),
33      (prevchar, char, nextchar),
34    )?;
35    if hasend {
36      break;
37    }
38    index += 1;
39  }
40  let final_str = temp.poly();
41  Ok((final_str, index))
42}