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

pub fn parse<'a>(lexer: &mut Lexer<'a, Token<'a>>) -> Result<Fact<'a>> {
    let predicate = match lexer.next() {
        Some(token) => match token {
            Ok(Token::Name(name)) => name,
            Ok(_) => return Err(("unexpected token", lexer.span())),
            Err(_) => return Err(("invalid token", lexer.span())),
        },
        None => return Err(("erroneous open paren", lexer.span())),
    };
    let objects = {
        let mut objects = Vec::new();

        while let Some(token) = lexer.next() {
            match token {
                Ok(Token::Name(name)) => objects.push(name),
                Ok(Token::RParen) => break,
                Ok(_) => return Err(("unexpected token", lexer.span())),
                Err(_) => return Err(("invalid token", lexer.span())),
            }
        }

        objects
    };
    Ok(Fact { predicate, objects })
}