#[derive(Clone, Debug)]
pub(crate) enum Token {
Open,
Close,
RegExp(String),
Name(String),
Char(char),
EscapedChar(char),
Plus, QuestionMark, Asterisk,
End,
InvalidChar,
}
pub(crate) enum Policy {
Strict,
_Lenient,
}
pub(crate) fn tokenize(input: &str, _policy: Policy) -> Vec<Token> {
let mut tokens = vec![];
let mut iter = input.chars().peekable();
loop {
let chr = if let Some(chr) = iter.next() {
chr
} else {
break;
};
match chr {
'*' => {
tokens.push(Token::Asterisk);
}
'+' => {
tokens.push(Token::Plus);
}
'?' => {
tokens.push(Token::QuestionMark);
}
'\\' => {
unimplemented!("EscapedChar");
}
'{' => {
tokens.push(Token::Open);
}
'}' => {
tokens.push(Token::Close)
}
':' => {
let mut name = String::new();
while let Some(chr) = iter.peek() {
match chr {
'A'..='Z' | 'a'..='z' => name.push(iter.next().unwrap()),
_ => break,
}
}
tokens.push(Token::Name(name))
}
'(' => {
unimplemented!("RegExp token")
},
_ => {
tokens.push(Token::Char(chr));
}
}
}
tokens.push(Token::End);
tokens
}