use super::Token;
pub fn match_tokens(tokens: &[Token], input: &[u8]) -> bool {
let (mut p, mut i) = (0usize, 0usize);
let mut star = None;
let mut retry_input = 0usize;
while i < input.len() {
match tokens.get(p) {
Some(Token::Literal(byte)) if *byte == input[i] => {
p += 1;
i += 1;
}
Some(Token::Any) => {
p += 1;
i += 1;
}
Some(Token::Star) => {
star = Some(p);
p += 1;
retry_input = i;
}
_ if star.is_some() => {
p = star.unwrap_or(0) + 1;
retry_input += 1;
i = retry_input;
}
_ => return false,
}
}
while matches!(tokens.get(p), Some(Token::Star)) {
p += 1;
}
p == tokens.len()
}