retoken/
error.rs

1use thiserror::Error;
2
3use crate::span::Span;
4
5#[derive(Debug, Error)]
6#[error("failed to slice at {0}")]
7pub struct SliceError(pub usize);
8
9#[derive(Debug, Error)]
10#[error("expected token {token:?} at {cursor}")]
11pub struct ExpectedTokenError<Alphabet> {
12    pub cursor: usize,
13    pub token: Alphabet,
14}
15
16#[derive(Debug, Error)]
17pub enum Error<Alphabet> {
18    #[error("{0}")]
19    Slice(#[from] SliceError),
20    #[error("{0}")]
21    ExpectedToken(ExpectedTokenError<Alphabet>),
22}
23
24impl<Alphabet> Error<Alphabet> {
25    pub fn slice(cursor: usize) -> Self {
26        Self::Slice(SliceError(cursor))
27    }
28
29    pub fn expected_token(cursor: usize, token: Alphabet) -> Self {
30        Self::ExpectedToken(ExpectedTokenError { cursor, token })
31    }
32
33    pub fn span(&self) -> Span {
34        let start = match &self {
35            Self::Slice(slice_error) => slice_error.0,
36            Self::ExpectedToken(expected_token_error) => expected_token_error.cursor,
37        };
38
39        Span { start, end: start }
40    }
41}