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