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}