swash/text/cluster/
parse.rs

1use super::{
2    super::Script, complex::ComplexState, myanmar::MyanmarState, simple::SimpleState, CharCluster,
3    Token,
4};
5
6/// Parser that accepts a sequence of characters and outputs character clusters.
7pub struct Parser<I> {
8    inner: Inner<I>,
9}
10
11// enum Inner<I> {
12//     Simple(SimpleClusters<Filter<I>>),
13//     Myanmar(MyanmarClusters<Filter<I>>),
14//     Complex(ComplexClusters<Filter<I>>),
15// }
16
17enum 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    /// Creates a new cluster parser for the specified script and iterator
28    /// over tokens.
29    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    /// Parses the next cluster.
44    #[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}