libhanzzok/syntax/parse/
parse_inline_constructor.rs1use 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}