blots_core/
parser.rs

1pub use pest::Token;
2use pest::{Parser, iterators::Pairs};
3
4#[derive(Parser)]
5#[grammar = "grammar.pest"]
6struct BlotsParser;
7
8#[cfg(not(target_arch = "wasm32"))]
9pub static CALL_COUNT: std::sync::atomic::AtomicUsize = std::sync::atomic::AtomicUsize::new(0);
10
11#[cfg(not(target_arch = "wasm32"))]
12pub static TOTAL_PARSE_TIME: std::sync::atomic::AtomicUsize =
13    std::sync::atomic::AtomicUsize::new(0);
14
15#[allow(clippy::result_large_err)]
16pub fn get_pairs(input: &str) -> Result<Pairs<'_, Rule>, pest::error::Error<Rule>> {
17    #[cfg(not(target_arch = "wasm32"))]
18    let start = std::time::Instant::now();
19
20    let pairs = BlotsParser::parse(Rule::input, input);
21
22    #[cfg(not(target_arch = "wasm32"))]
23    CALL_COUNT.fetch_add(1, std::sync::atomic::Ordering::AcqRel);
24
25    #[cfg(not(target_arch = "wasm32"))]
26    TOTAL_PARSE_TIME.fetch_add(
27        start.elapsed().as_micros() as usize,
28        std::sync::atomic::Ordering::AcqRel,
29    );
30
31    pairs
32}
33
34#[allow(clippy::result_large_err)]
35pub fn get_tokens(input: &str) -> Result<Vec<Token<'_, Rule>>, pest::error::Error<Rule>> {
36    let pairs = BlotsParser::parse(Rule::input, input)?;
37    let tokens: Vec<Token<Rule>> = pairs.flat_map(|pair| pair.tokens()).collect();
38    Ok(tokens)
39}