brack-parser 0.1.0

The parser for the Brack markup language
Documentation
use anyhow::Result;
use brack_sdk_rs::ast::AST;
use brack_tokenizer::tokens::Token;

use crate::{arguments, error::ParserError, ident};

// ident (expr ("," expr)*)?
pub fn parse(tokens: &Vec<Token>) -> Result<(Vec<AST>, Vec<Token>)> {
    let mut new_tokens = tokens.clone();
    let mut result = vec![];

    match ident::parse(&new_tokens) {
        Ok((ast, tokens)) => {
            result.push(ast);
            new_tokens = tokens;
        }
        Err(e) => return Err(e),
    }

    if let Token::CurlyBracketOpen(_) = new_tokens.first().unwrap() {
        return Err(anyhow::anyhow!(ParserError::new(
            "Curly Brackets is not allowed in Square Brackets or Angle Brackets.".to_string(),
            new_tokens.first().unwrap().clone(),
        )));
    }

    if let Ok((asts, tokens)) = arguments::parse(&new_tokens) {
        for ast in asts {
            result.push(ast);
        }
        new_tokens = tokens;
    }

    Ok((result, new_tokens))
}