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