crossandra 1.0.1

A fast and simple lexical tokenization library.
Documentation
#[derive(Debug)]
pub enum Error {
    BadToken(char, usize),
    DuplicatePattern(String),
    EmptyLiteral,
    InvalidRegex(Box<fancy_regex::Error>),
}

impl std::fmt::Display for Error {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::BadToken(c, p) => write!(f, "invalid token {c:?} at position {p}"),
            Self::DuplicatePattern(name) => write!(f, "duplicate pattern {name:?}"),
            Self::EmptyLiteral => write!(f, "literals cannot be empty"),
            Self::InvalidRegex(err) => err.fmt(f),
        }
    }
}

#[cfg(test)]
mod tests {
    use crate::error::Error;

    #[test]
    fn error_display() {
        assert_eq!(
            Error::BadToken('x', 7).to_string(),
            "invalid token 'x' at position 7"
        );
        assert_eq!(
            Error::DuplicatePattern("string".into()).to_string(),
            "duplicate pattern \"string\""
        );
        assert_eq!(Error::EmptyLiteral.to_string(), "literals cannot be empty");
        assert_eq!(
            Error::InvalidRegex(Box::new(fancy_regex::Regex::new("+").unwrap_err())).to_string(),
            "Parsing error at position 0: Target of repeat operator is invalid"
        );
    }
}