swash/text/cluster/
parse.rs
1use super::{
2 super::Script, complex::ComplexState, myanmar::MyanmarState, simple::SimpleState, CharCluster,
3 Token,
4};
5
6pub struct Parser<I> {
8 inner: Inner<I>,
9}
10
11enum Inner<I> {
18 Simple(SimpleState<I>),
19 Myanmar(MyanmarState<I>),
20 Complex(ComplexState<I>),
21}
22
23impl<I> Parser<I>
24where
25 I: Iterator<Item = Token> + Clone,
26{
27 pub fn new(script: Script, tokens: I) -> Self {
30 Self {
31 inner: if script.is_complex() {
32 if script == Script::Myanmar {
33 Inner::Myanmar(MyanmarState::new(tokens))
34 } else {
35 Inner::Complex(ComplexState::new(script, tokens))
36 }
37 } else {
38 Inner::Simple(SimpleState::new(tokens))
39 },
40 }
41 }
42
43 #[inline]
45 pub fn next(&mut self, cluster: &mut CharCluster) -> bool {
46 cluster.clear();
47 match self.inner {
48 Inner::Simple(ref mut c) => c.next(cluster),
49 Inner::Myanmar(ref mut c) => c.next(cluster),
50 Inner::Complex(ref mut c) => c.next(cluster),
51 }
52 }
53}