ziyy_core/parser/
mod.rs

1use crate::error::Result;
2use crate::splitter::fragment::{Fragment, FragmentType};
3use chunk::{Chunk, ChunkData};
4#[cfg(feature = "parallel")]
5use rayon::prelude::*;
6
7pub mod ansi;
8pub mod chunk;
9pub mod color;
10pub mod tag_parser;
11pub mod word_parser;
12
13pub struct Parser {
14    parse_placeholders: bool,
15}
16
17impl Default for Parser {
18    fn default() -> Self {
19        Self::new(true)
20    }
21}
22
23impl Parser {
24    pub fn new(parse_placeholders: bool) -> Self {
25        Self { parse_placeholders }
26    }
27
28    pub fn parse<'a>(&self, frags: Vec<Fragment<'a>>) -> Vec<Result<Chunk<'a>>> {
29        // let word_parer = WordParser::new();
30        #[cfg(feature = "parallel")]
31        {
32            frags
33                .into_par_iter()
34                .map(|frag| {
35                    let span = frag.span;
36                    match frag.r#type {
37                        FragmentType::Tag => {
38                            let mut tag_parser =
39                                tag_parser::TagParser::new(self.parse_placeholders);
40                            Ok(Chunk {
41                                data: ChunkData::Tag(tag_parser.parse(frag)?),
42                                span,
43                            })
44                        }
45
46                        FragmentType::Whitespace => {
47                            // Handle whitespace fragments
48                            Ok(Chunk {
49                                data: ChunkData::WhiteSpace(frag.lexeme),
50                                span,
51                            })
52                        }
53
54                        FragmentType::Word => {
55                            // Handle word fragments
56                            // let chs = word_parer.parse(frag)?;
57                            // chunks.extend_from_slice(&chs);
58                            Ok(Chunk {
59                                data: ChunkData::Word(frag.lexeme),
60                                span,
61                            })
62                        }
63                    }
64                })
65                .collect()
66        }
67
68        #[cfg(not(feature = "parallel"))]
69        frags
70            .into_iter()
71            .map(|frag| {
72                let span = frag.span;
73                match frag.r#type {
74                    FragmentType::Tag => {
75                        let mut tag_parser = tag_parser::TagParser::new(self.parse_placeholders);
76                        Ok(Chunk {
77                            data: ChunkData::Tag(tag_parser.parse(frag)?),
78                            span,
79                        })
80                    }
81
82                    FragmentType::Whitespace => {
83                        // Handle whitespace fragments
84                        Ok(Chunk {
85                            data: ChunkData::WhiteSpace(frag.lexeme),
86                            span,
87                        })
88                    }
89
90                    FragmentType::Word => {
91                        // Handle word fragments
92                        // let chs = word_parer.parse(frag)?;
93                        // chunks.extend_from_slice(&chs);
94                        Ok(Chunk {
95                            data: ChunkData::Word(frag.lexeme),
96                            span,
97                        })
98                    }
99                }
100            })
101            .collect()
102    }
103}