use crate::compiler::logger::ErrorDetails;
use super::Metadata;
pub fn variable(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, ErrorDetails> {
match meta.get_current_token() {
Some(token) => {
let mut is_later: bool = false;
for letter in token.word.chars() {
if is_later {
if !(letter.is_alphanumeric() || extend.contains(&letter)) {
return Err(ErrorDetails::from_token_option(Some(token)))
}
}
else {
if !(letter.is_alphabetic() || extend.contains(&letter)) {
return Err(ErrorDetails::from_token_option(Some(token)))
}
is_later = true;
}
}
meta.increment_index();
Ok(token.word.clone())
}
None => Err(ErrorDetails::with_eof())
}
}
pub fn alphabetic(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, ErrorDetails> {
match meta.get_current_token() {
Some(token) => {
if token.word.chars().all(|letter| letter.is_alphabetic() || extend.contains(&letter)) {
meta.increment_index();
Ok(token.word.clone())
} else { Err(ErrorDetails::from_token_option(Some(token))) }
}
None => Err(ErrorDetails::with_eof())
}
}
pub fn alphanumeric(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, ErrorDetails> {
match meta.get_current_token() {
Some(token) => {
if token.word.chars().all(|letter| letter.is_alphanumeric() || extend.contains(&letter)) {
meta.increment_index();
Ok(token.word.clone())
} else { Err(ErrorDetails::from_token_option(Some(token))) }
}
None => Err(ErrorDetails::with_eof())
}
}
pub fn numeric(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, ErrorDetails> {
match meta.get_current_token() {
Some(token) => {
if token.word.chars().all(|letter| letter.is_numeric() || extend.contains(&letter)) {
meta.increment_index();
Ok(token.word.clone())
} else { Err(ErrorDetails::from_token_option(Some(token))) }
}
None => Err(ErrorDetails::with_eof())
}
}
pub fn integer(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, ErrorDetails> {
match meta.get_current_token() {
Some(token) => {
let mut word = token.word.clone();
if word.chars().next() == Some('-') {
word = word[1..].chars().collect();
}
for letter in word.chars() {
if !(letter.is_numeric() || extend.contains(&letter)) {
return Err(ErrorDetails::from_token_option(Some(token)))
}
}
meta.increment_index();
Ok(token.word.clone())
}
None => Err(ErrorDetails::with_eof())
}
}
pub fn float(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, ErrorDetails> {
match meta.get_current_token() {
Some(token) => {
let mut word = token.word.clone();
if word.chars().next() == Some('-') {
word = word[1..].chars().collect();
}
let mut is_frac = false;
for letter in word.chars() {
if letter == '.' {
is_frac = if is_frac { return Err(ErrorDetails::from_token_option(Some(token))) } else { true };
continue
}
if !(letter.is_numeric() || extend.contains(&letter)) {
return Err(ErrorDetails::from_token_option(Some(token)))
}
}
meta.increment_index();
Ok(token.word.clone())
}
None => Err(ErrorDetails::with_eof())
}
}
pub fn number(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, ErrorDetails> {
if let Ok(integer) = integer(meta, extend.clone()) {
return Ok(integer);
}
float(meta, extend)
}