Skip to main content

px_wsdom_ts_parse/parser/
expr.rs

1use winnow::{
2    combinator::{opt, preceded},
3    prelude::PResult,
4    Parser,
5};
6
7use super::util::{token, word1, Parsable};
8
9#[derive(Debug, Clone, PartialEq, Eq)]
10pub enum Expr<'a> {
11    Name { name: &'a str },
12    Dot { left: Box<Expr<'a>>, right: &'a str },
13}
14
15impl<'a> Parsable<'a> for Expr<'a> {
16    fn parse(input: &mut &'a str) -> PResult<Self> {
17        (word1, opt(preceded(token('.'), word1)))
18            .map(|(left, after_dot)| match after_dot {
19                Some(right) => Self::Dot {
20                    left: Box::new(Self::Name { name: left }),
21                    right,
22                },
23                None => Self::Name { name: left },
24            })
25            .parse_next(input)
26    }
27}