use std::fmt;
use crate::tokenizer::Tokenizer;
pub trait ConstructableToken {
fn from_tokenizer(t: &Tokenizer, token_type: TokenType, index: usize, length: usize) -> Self;
}
#[derive(Debug, Eq, PartialEq, Clone)]
pub enum TokenType {
Identifier,
Number,
String,
Equals,
OpenBracket,
CloseBracket,
GreaterThan,
LessThan,
GreaterThanEq,
LessThanEq,
ExistenceCheck,
Boolean,
Date,
}
#[derive(Debug)]
pub struct Token {
pub index: usize,
pub length: usize,
pub token_type: TokenType,
}
impl Token {
pub fn new(token_type: TokenType, index: usize, length: usize) -> Token {
Token {
index,
length,
token_type,
}
}
}
impl ConstructableToken for Token {
fn from_tokenizer(_t: &Tokenizer, token_type: TokenType, index: usize, length: usize) -> Self {
Token::new(token_type, index, length)
}
}
impl fmt::Display for Token {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"token type {:?} at pos {}, length {}",
self.token_type, self.index, self.length
)
}
}
#[derive(Debug)]
pub struct OwnedToken {
pub index: usize,
pub token_type: TokenType,
pub value: String,
}
impl ConstructableToken for OwnedToken {
fn from_tokenizer(t: &Tokenizer, token_type: TokenType, index: usize, length: usize) -> Self {
OwnedToken {
index,
token_type,
value: t.str_for_range((index, index + length)).to_owned(),
}
}
}