Documentation
use super::{token::Token, Parameter, Result};
use logos::Lexer;

pub fn parse<'a>(
    lexer: &mut Lexer<'a, Token<'a>>,
) -> Result<Vec<Parameter<'a>>> {
    let mut parameters = Vec::new();

    let mut queue: Vec<&'a str> = Vec::new();
    while let Some(token) = lexer.next() {
        match token {
            Ok(Token::Name(name)) => queue.push(name),
            Ok(Token::TypeSeparator) => match lexer.next() {
                Some(token) => match token {
                    Ok(Token::Name(name)) => {
                        for item in queue.iter() {
                            parameters.push(Parameter {
                                name: item,
                                r#type: Some(name),
                            });
                        }
                        queue.clear();
                    }
                    Ok(_) => return Err(("unexpected token", lexer.span())),
                    Err(_) => return Err(("invalid token", lexer.span())),
                },
                None => return Err(("erroneous type separator", lexer.span())),
            },
            Ok(Token::RParen) => break,
            Ok(_) => return Err(("unexpected token", lexer.span())),
            Err(_) => return Err(("invalid token", lexer.span())),
        }
    }

    for item in queue.iter() {
        parameters.push(Parameter {
            name: item,
            r#type: None,
        });
    }

    Ok(parameters)
}