use crate::internal::{errors::ParseError, lexer::Token};
use logos::Logos;
pub fn new<'a>(input: &'a str) -> Result<crate::internal::parser::Parser<'a>, ParseError> {
let mut lex = Token::lexer(input);
let mut tokens = Vec::new();
while let Some(item) = lex.next() {
match item {
Ok(tok) => {
let slice = lex.slice();
tokens.push((tok, slice));
}
Err(()) => {
return Err(ParseError::Lex(lex.slice().to_string()));
}
}
}
Ok(crate::internal::parser::Parser {
input,
tokens,
pos: 0,
})
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_new_simple_formula() {
let result = new("y ~ x");
assert!(result.is_ok());
let parser = result.unwrap();
assert_eq!(parser.input, "y ~ x");
assert_eq!(parser.pos, 0);
assert_eq!(parser.tokens.len(), 3); }
#[test]
fn test_new_complex_formula() {
let result = new("y ~ x + poly(x, 2)");
assert!(result.is_ok());
let parser = result.unwrap();
assert_eq!(parser.input, "y ~ x + poly(x, 2)");
assert_eq!(parser.pos, 0);
assert!(parser.tokens.len() > 5); }
#[test]
fn test_new_with_whitespace() {
let result = new(" y ~ x ");
assert!(result.is_ok());
let parser = result.unwrap();
assert_eq!(parser.input, " y ~ x ");
assert_eq!(parser.pos, 0);
assert_eq!(parser.tokens.len(), 3);
}
#[test]
fn test_new_empty_string() {
let result = new("");
assert!(result.is_ok());
let parser = result.unwrap();
assert_eq!(parser.input, "");
assert_eq!(parser.pos, 0);
assert_eq!(parser.tokens.len(), 0);
}
}