libhanzzok/syntax/parse/
parse_inline_constructor.rs

1use nom::multi::many1;
2
3use crate::{
4    core::ast::InlineConstructorNode,
5    syntax::{parse::nom_ext::satisfy_transform, Token, TokenKind},
6};
7
8use super::{
9    nom_ext::{tag, HanzzokParser},
10    parse_hzdata::parse_hzdata_paired,
11    ParseResult,
12};
13
14fn parse_inline_constructor_params(p: HanzzokParser) -> ParseResult<Vec<Token>> {
15    parse_hzdata_paired(
16        TokenKind::PunctuationLeftParenthesis,
17        TokenKind::PunctuationRightParenthesis,
18        true,
19    )(p)
20}
21
22pub fn parse_inline_constructor(p: HanzzokParser) -> ParseResult<InlineConstructorNode> {
23    let tt = p.create_tracker();
24    let (p, _) = tag(TokenKind::PunctuationNumberSign)(p)?;
25
26    let (p, name) = many1(satisfy_transform(|t| match &t.kind {
27        TokenKind::Word(w) => Some(w.clone()),
28        TokenKind::PunctuationHyphenMinus => Some("-".to_owned()),
29        _ => None,
30    }))(p)?;
31
32    let name: String = name.into_iter().map(|(_, name)| name).collect();
33
34    let (p, params) = parse_inline_constructor_params(p)?;
35
36    let tokens = tt.end(&p);
37
38    Ok((
39        p,
40        InlineConstructorNode {
41            name,
42            params,
43            tokens,
44        },
45    ))
46}