libhanzzok 0.1.5

Hanzzok compiler library
Documentation
use nom::{
    branch::alt,
    combinator::map,
    multi::{many0, many1},
};

use crate::{
    core::{
        ast::{HanzzokAstNode, InlineObjectNode},
        Compiler,
    },
    syntax::parse::{
        nom_ext::HanzzokParser, parse_inline_object::parse_inline_object,
        parse_text::parse_single_newline,
    },
};

use self::{parse_block_constructor::parse_block_constructor, parse_newline::parse_newline};

use super::Token;

mod nom_ext;
mod parse_block_constructor;
mod parse_decorator_chain;
mod parse_hzdata;
mod parse_inline_constructor;
mod parse_inline_object;
mod parse_newline;
mod parse_text;

type Error = nom::error::Error<HanzzokParser>;
type ParseResult<T> = nom::IResult<HanzzokParser, T, Error>;

pub fn parse_root(tokens: Vec<Token>, compiler: &Compiler) -> Vec<HanzzokAstNode> {
    let p = HanzzokParser::new(tokens, &compiler.block_constructor_rules);
    many0(alt((
        map(parse_block_constructor, |node| {
            vec![HanzzokAstNode::BlockConstructor(node)]
        }),
        map(many1(parse_inline_object), |nodes| {
            vec![HanzzokAstNode::InlineObjectBlock(nodes)]
        }),
        map(parse_newline, |node| vec![node]),
        map(parse_single_newline, |node| {
            vec![HanzzokAstNode::InlineObjectBlock(vec![
                InlineObjectNode::Text(node),
            ])]
        }),
    )))(p)
    .map(|(_, vec)| vec)
    .unwrap_or_else(|_| Vec::new())
    .into_iter()
    .flatten()
    .collect()
}

#[cfg(target_arch = "wasm32")]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen::prelude::wasm_bindgen)]
pub struct HanzzokParsed {
    pub(crate) nodes: Vec<crate::core::ast::HanzzokAstNodeWrapper>,
}

#[cfg(target_arch = "wasm32")]
#[cfg_attr(target_arch = "wasm32", wasm_bindgen::prelude::wasm_bindgen)]
pub fn w_parse_root(tokens: super::HanzzokTokenized, compiler: &Compiler) -> HanzzokParsed {
    HanzzokParsed {
        nodes: parse_root(tokens.tokens, compiler)
            .into_iter()
            .map(|node| crate::core::ast::HanzzokAstNodeWrapper { handle: node })
            .collect(),
    }
}