use crate::input::Filtered;
use super::{
token::{Token, TokenParseOutput, TokenParseResult},
unicode_range::UnicodeRangeToken,
};
pub enum TokenOrUnicodeRange<'a> {
Token(Token<'a>),
UnicodeRange(UnicodeRangeToken<'a>),
}
pub enum TokenOrUnicodeRangeParseOutput<'a> {
TokenAndRemaining(TokenOrUnicodeRange<'a>, Filtered<'a>),
Eof,
}
impl<'a> TokenOrUnicodeRange<'a> {
pub const fn consume(
stream: Filtered<'a>,
) -> TokenParseResult<TokenOrUnicodeRangeParseOutput<'a>> {
let (u, stream) = UnicodeRangeToken::consume(stream);
if let Some(u) = u {
Ok(TokenOrUnicodeRangeParseOutput::TokenAndRemaining(
TokenOrUnicodeRange::UnicodeRange(u),
stream,
))
} else {
match Token::consume(stream) {
Ok(out) => Ok(match out {
TokenParseOutput::TokenAndRemaining(token, stream) => {
TokenOrUnicodeRangeParseOutput::TokenAndRemaining(
TokenOrUnicodeRange::Token(token),
stream,
)
}
TokenParseOutput::Eof => TokenOrUnicodeRangeParseOutput::Eof,
}),
Err(err) => Err(err),
}
}
}
}