rsjsonnet_lang/parser/
error.rs

1use std::collections::BTreeSet;
2
3use crate::span::SpanId;
4use crate::token::{STokenKind, TokenKind};
5
6#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
7pub enum ExpectedToken {
8    EndOfFile,
9    Simple(STokenKind),
10    Ident,
11    Number,
12    String,
13    TextBlock,
14    Expr,
15    BinaryOp,
16}
17
18#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
19pub enum ActualToken {
20    EndOfFile,
21    Simple(STokenKind),
22    OtherOp(String),
23    Ident(String),
24    Number,
25    String,
26    TextBlock,
27}
28
29impl ActualToken {
30    pub(super) fn from_token_kind(kind: &TokenKind<'_, '_>) -> Self {
31        match *kind {
32            TokenKind::EndOfFile => Self::EndOfFile,
33            TokenKind::Whitespace => unreachable!(),
34            TokenKind::Comment => unreachable!(),
35            TokenKind::Simple(kind) => Self::Simple(kind),
36            TokenKind::OtherOp(op) => Self::OtherOp(op.into()),
37            TokenKind::Ident(ident) => Self::Ident(ident.value().into()),
38            TokenKind::Number(_) => Self::Number,
39            TokenKind::String(_) => Self::String,
40            TokenKind::TextBlock(_) => Self::TextBlock,
41        }
42    }
43}
44
45#[derive(Clone, Debug, PartialEq, Eq)]
46pub enum ParseError {
47    Expected {
48        span: SpanId,
49        expected: BTreeSet<ExpectedToken>,
50        instead: ActualToken,
51    },
52}