px_wsdom_ts_parse/parser/
expr.rs1use 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}