Skip to main content

px_wsdom_ts_parse/parser/
interface.rs

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