libhanzzok 0.1.5

Hanzzok compiler library
Documentation
use nom::multi::many1;

use crate::{
    core::ast::InlineConstructorNode,
    syntax::{parse::nom_ext::satisfy_transform, Token, TokenKind},
};

use super::{
    nom_ext::{tag, HanzzokParser},
    parse_hzdata::parse_hzdata_paired,
    ParseResult,
};

fn parse_inline_constructor_params(p: HanzzokParser) -> ParseResult<Vec<Token>> {
    parse_hzdata_paired(
        TokenKind::PunctuationLeftParenthesis,
        TokenKind::PunctuationRightParenthesis,
        true,
    )(p)
}

pub fn parse_inline_constructor(p: HanzzokParser) -> ParseResult<InlineConstructorNode> {
    let tt = p.create_tracker();
    let (p, _) = tag(TokenKind::PunctuationNumberSign)(p)?;

    let (p, name) = many1(satisfy_transform(|t| match &t.kind {
        TokenKind::Word(w) => Some(w.clone()),
        TokenKind::PunctuationHyphenMinus => Some("-".to_owned()),
        _ => None,
    }))(p)?;

    let name: String = name.into_iter().map(|(_, name)| name).collect();

    let (p, params) = parse_inline_constructor_params(p)?;

    let tokens = tt.end(&p);

    Ok((
        p,
        InlineConstructorNode {
            name,
            params,
            tokens,
        },
    ))
}