Skip to main content

px_wsdom_ts_parse/parser/
declare_class.rs

1use winnow::{
2    combinator::{delimited, opt, preceded, repeat},
3    prelude::PResult,
4    Parser,
5};
6
7use super::{
8    comment::WithComment,
9    generic::GenericsDeclaration,
10    member::Member,
11    util::{token, token_word, word1, Parsable},
12};
13
14#[derive(Debug, Clone, PartialEq, Eq)]
15pub struct DeclareClass<'a> {
16    pub name: &'a str,
17    pub generics: GenericsDeclaration<'a>,
18    pub members: Vec<WithComment<'a, Member<'a>>>,
19}
20
21impl<'a> Parsable<'a> for DeclareClass<'a> {
22    fn parse(input: &mut &'a str) -> PResult<Self> {
23        preceded(
24            (token_word("declare"), token_word("class")),
25            (
26                word1,
27                opt(GenericsDeclaration::parse),
28                delimited(
29                    token('{'),
30                    repeat(0.., WithComment::<Member>::parse),
31                    token('}'),
32                ),
33            ),
34        )
35        .map(|(name, generics, members)| Self {
36            name,
37            generics: generics.unwrap_or_default(),
38            members,
39        })
40        .parse_next(input)
41    }
42}