luaparser 0.1.1

Read Lua 5.1 code and produce an abstract syntax tree
Documentation
use crate::parser::{
    parse_expression_list,
    try_parse_table_expression,
    OptionParsingResult,
    ParsingError,
};
use crate::parser::token_utils::{
    is_symbol,
    skip_first_token,
    LuaSymbol,
};
use crate::parser::node_types::NodeTypes;
use crate::parser::node_types::builders::Arguments;

use lualexer::{Token, TokenType};

pub fn try_parse_arguments<'a, T: NodeTypes>(
    tokens: &'a [Token<'a>]
) -> OptionParsingResult<'a, T::Arguments> {
    if let Some(token) = tokens.first() {
        if is_symbol(token, LuaSymbol::OpenParenthese) {
            let (expressions, next_tokens) = parse_expression_list::<T>(skip_first_token(tokens))?;

            next_tokens.first()
                .filter(|token| is_symbol(token, LuaSymbol::CloseParenthese))
                .ok_or(ParsingError::ClosingParentheseExpected)
                .map(|_| Some((T::Arguments::from_expressions(expressions), skip_first_token(next_tokens))))

        } else if token.is_type(TokenType::String) {
            Ok(Some((T::Arguments::from_string(token.get_content().to_owned()), skip_first_token(tokens))))

        } else if let Some((table, next_tokens)) = try_parse_table_expression::<T>(tokens)? {
            Ok(Some((T::Arguments::from_table(table), next_tokens)))

        } else {
            Ok(None)
        }
    } else {
        Ok(None)
    }
}