#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum LexerMode {
#[default]
ExpectTerm,
ExpectOperator,
ExpectDelimiter,
InFormatBody,
InDataSection,
}
impl LexerMode {
pub fn is_expect_term(&self) -> bool {
matches!(self, LexerMode::ExpectTerm)
}
pub fn is_expect_operator(&self) -> bool {
matches!(self, LexerMode::ExpectOperator)
}
pub fn is_expect_delimiter(&self) -> bool {
matches!(self, LexerMode::ExpectDelimiter)
}
}
#[cfg(test)]
mod tests {
use super::LexerMode;
#[test]
fn lexer_mode_expect_term_is_term() -> Result<(), Box<dyn std::error::Error>> {
assert!(LexerMode::ExpectTerm.is_expect_term());
Ok(())
}
#[test]
fn lexer_mode_expect_operator_is_not_term() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::ExpectOperator.is_expect_term());
Ok(())
}
#[test]
fn lexer_mode_expect_delimiter_is_not_term() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::ExpectDelimiter.is_expect_term());
Ok(())
}
#[test]
fn lexer_mode_in_format_body_is_not_term() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::InFormatBody.is_expect_term());
Ok(())
}
#[test]
fn lexer_mode_in_data_section_is_not_term() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::InDataSection.is_expect_term());
Ok(())
}
#[test]
fn lexer_mode_expect_operator_is_operator() -> Result<(), Box<dyn std::error::Error>> {
assert!(LexerMode::ExpectOperator.is_expect_operator());
Ok(())
}
#[test]
fn lexer_mode_expect_term_is_not_operator() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::ExpectTerm.is_expect_operator());
Ok(())
}
#[test]
fn lexer_mode_expect_delimiter_is_not_operator() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::ExpectDelimiter.is_expect_operator());
Ok(())
}
#[test]
fn lexer_mode_in_format_body_is_not_operator() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::InFormatBody.is_expect_operator());
Ok(())
}
#[test]
fn lexer_mode_in_data_section_is_not_operator() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::InDataSection.is_expect_operator());
Ok(())
}
#[test]
fn lexer_mode_expect_delimiter_is_delimiter() -> Result<(), Box<dyn std::error::Error>> {
assert!(LexerMode::ExpectDelimiter.is_expect_delimiter());
Ok(())
}
#[test]
fn lexer_mode_expect_term_is_not_delimiter() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::ExpectTerm.is_expect_delimiter());
Ok(())
}
#[test]
fn lexer_mode_expect_operator_is_not_delimiter() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::ExpectOperator.is_expect_delimiter());
Ok(())
}
#[test]
fn lexer_mode_in_format_body_is_not_delimiter() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::InFormatBody.is_expect_delimiter());
Ok(())
}
#[test]
fn lexer_mode_in_data_section_is_not_delimiter() -> Result<(), Box<dyn std::error::Error>> {
assert!(!LexerMode::InDataSection.is_expect_delimiter());
Ok(())
}
#[test]
fn lexer_mode_no_variant_is_both_term_and_operator() -> Result<(), Box<dyn std::error::Error>> {
let modes = [
LexerMode::ExpectTerm,
LexerMode::ExpectOperator,
LexerMode::ExpectDelimiter,
LexerMode::InFormatBody,
LexerMode::InDataSection,
];
for mode in modes {
assert!(
!(mode.is_expect_term() && mode.is_expect_operator()),
"{mode:?} should not be both term-expecting and operator-expecting",
);
}
Ok(())
}
#[test]
fn lexer_mode_default_is_expect_term() -> Result<(), Box<dyn std::error::Error>> {
assert_eq!(LexerMode::default(), LexerMode::ExpectTerm);
Ok(())
}
}