use crate::compiling::failing::position_info::PositionInfo;
use crate::compiling::failing::failure::Failure;
use super::Metadata;
pub fn variable(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, Failure> {
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(Failure::Quiet(PositionInfo::from_token(meta, Some(token))))
}
}
else {
if !(letter.is_alphabetic() || extend.contains(&letter)) {
return Err(Failure::Quiet(PositionInfo::from_token(meta, Some(token))))
}
is_later = true;
}
}
meta.increment_index();
Ok(token.word)
}
None => Err(Failure::Quiet(PositionInfo::at_eof(meta)))
}
}
pub fn alphabetic(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, Failure> {
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)
} else { Err(Failure::Quiet(PositionInfo::from_token(meta, Some(token)))) }
}
None => Err(Failure::Quiet(PositionInfo::at_eof(meta)))
}
}
pub fn alphanumeric(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, Failure> {
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)
} else { Err(Failure::Quiet(PositionInfo::from_token(meta, Some(token)))) }
}
None => Err(Failure::Quiet(PositionInfo::at_eof(meta)))
}
}
pub fn numeric(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, Failure> {
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)
} else { Err(Failure::Quiet(PositionInfo::from_token(meta, Some(token)))) }
}
None => Err(Failure::Quiet(PositionInfo::at_eof(meta)))
}
}
pub fn integer(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, Failure> {
match meta.get_current_token() {
Some(token) => {
let mut word = token.word.clone();
if word.starts_with('-') {
word = word[1..].chars().collect();
}
for letter in word.chars() {
if !(letter.is_numeric() || extend.contains(&letter)) {
return Err(Failure::Quiet(PositionInfo::from_token(meta, Some(token))))
}
}
meta.increment_index();
Ok(token.word)
}
None => Err(Failure::Quiet(PositionInfo::at_eof(meta)))
}
}
pub fn float(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, Failure> {
match meta.get_current_token() {
Some(token) => {
let mut word = token.word.clone();
if word.starts_with('-') {
word = word[1..].chars().collect();
}
let mut is_frac = false;
for letter in word.chars() {
if letter == '.' {
is_frac = if is_frac { return Err(Failure::Quiet(PositionInfo::from_token(meta, Some(token)))) } else { true };
continue
}
if !(letter.is_numeric() || extend.contains(&letter)) {
return Err(Failure::Quiet(PositionInfo::from_token(meta, Some(token))))
}
}
meta.increment_index();
Ok(token.word)
}
None => Err(Failure::Quiet(PositionInfo::at_eof(meta)))
}
}
pub fn number(meta: &mut impl Metadata, extend: Vec<char>) -> Result<String, Failure> {
if let Ok(integer) = integer(meta, extend.clone()) {
return Ok(integer);
}
float(meta, extend)
}