use crate::{lexer::LexerError, span::Span}; /// Kinds of errors that can occur during parsing. #[derive(Debug, Clone, PartialEq)] pub enum ParserErrorKind { /// An error which ocurred during lexical analysis. Lexer(LexerError), /// Key in map is missing its corresponding value. MissingValueInMap, /// Opening delimiter does not have a matching closing delimiter. UnclosedSequence, /// An unexpected closing delimiter was found. UnexpectedClosingDelimiter, /// Unexpectedly reached end of input. UnexpectedEof, /// An unmatched closing delimiter was found. UnmatchedClosingDelimiter, } /// Parser error, with a start and end location. #[derive(Debug, Clone, PartialEq)] pub struct ParserError { /// The type of error encountered. pub kind: ParserErrorKind, /// The span in which the error occurred. pub span: Span, } impl ParserError { /// Construct a new instance of `ParserError`. #[must_use] pub const fn new(kind: ParserErrorKind, span: Span) -> Self { Self { kind, span } } } impl From for ParserError { fn from(err: LexerError) -> Self { let span = err.span.clone(); Self::new(ParserErrorKind::Lexer(err), span) } } impl std::error::Error for ParserError {} #[cfg(not(tarpaulin_include))] impl std::fmt::Display for ParserError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { use ParserErrorKind::*; match &self.kind { Lexer(err) => write!(f, "{err}"), MissingValueInMap => write!(f, "Key in map is missing its corresponding value"), UnclosedSequence => write!( f, "Opening delimiter does not have a matching closing delimiter" ), UnexpectedClosingDelimiter => write!(f, "An unexpected closing delimiter was found"), UnexpectedEof => write!(f, "Unexpectedly reached end of input"), UnmatchedClosingDelimiter => write!(f, "An unmatched closing delimiter was found"), } } }