Skip to main content

harmony_jolt/dsl/
error.rs

1use std::fmt;
2use std::error::Error;
3use std::num::ParseIntError;
4use thiserror::Error as ThisError;
5use super::token::Token;
6
7#[derive(Debug, PartialEq)]
8pub struct ParseError {
9    pub(crate) pos: usize,
10    pub(crate) cause: Box<ParseErrorCause>,
11}
12
13#[derive(Debug, ThisError, PartialEq)]
14pub enum ParseErrorCause {
15    #[error("Unexpected end of input")]
16    UnexpectedEndOfInput,
17    #[error("Unexpected character: '{0}'")]
18    UnexpectedChar(char),
19    #[error("Unexpected token: {0:?}")]
20    UnexpectedToken(Token),
21    #[error("Invalid index literal: {raw}\n{source}")]
22    InvalidIndex {
23        raw: String,
24        #[source]
25        source: ParseIntError,
26    },
27    #[error("Maximum recursion depth ({0}) reached.")]
28    MaximumRecursion(usize),
29    #[error("put_back buffer is already full. THIS SHOULD NEVER HAPPEN.")]
30    PutBackBufferFull,
31    #[error("expected an index value but failed to find it.")]
32    ExpectedIdx,
33}
34
35impl fmt::Display for ParseError {
36    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37        write!(
38            f,
39            "Failed to parse input. Error near {}.\n{}",
40            self.pos, self.cause
41        )
42    }
43}
44
45impl Error for ParseError {}