Skip to main content

oak_json/lexer/
token_type.rs

1use oak_core::{Token, TokenType, UniversalTokenRole};
2
3/// Alias for `Token<JsonTokenType>`.
4pub type JsonToken = Token<JsonTokenType>;
5
6/// Token types for the JSON lexer.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9pub enum JsonTokenType {
10    /// Root node of the JSON document.
11    Root,
12    /// A JSON value.
13    Value,
14    /// A JSON object.
15    Object,
16    /// A JSON array.
17    Array,
18    /// A JSON string.
19    String,
20    /// A JSON number.
21    Number,
22    /// A JSON boolean.
23    Boolean,
24    /// A JSON null value.
25    Null,
26    /// An entry in a JSON object.
27    ObjectEntry,
28    /// An element in a JSON array.
29    ArrayElement,
30    /// An error node in the parse tree.
31    ErrorNode,
32    /// Left brace `{`.
33    LeftBrace,
34    /// Right brace `}`.
35    RightBrace,
36    /// Left bracket `[`.
37    LeftBracket,
38    /// Right bracket `]`.
39    RightBracket,
40    /// Comma `,`.
41    Comma,
42    /// Colon `:`.
43    Colon,
44    /// A string literal.
45    StringLiteral,
46    /// A number literal.
47    NumberLiteral,
48    /// A boolean literal (`true` or `false`).
49    BooleanLiteral,
50    /// A null literal (`null`).
51    NullLiteral,
52    /// A bare key (used in some JSON variants).
53    BareKey,
54    /// Whitespace (spaces, tabs, newlines).
55    Whitespace,
56    /// A comment.
57    Comment,
58    /// End of stream.
59    Eof,
60    /// An error token.
61    Error,
62}
63
64impl TokenType for JsonTokenType {
65    type Role = UniversalTokenRole;
66    const END_OF_STREAM: Self = Self::Eof;
67
68    fn is_ignored(&self) -> bool {
69        matches!(self, Self::Whitespace | Self::Comment)
70    }
71
72    fn role(&self) -> Self::Role {
73        match self {
74            Self::Whitespace => UniversalTokenRole::Whitespace,
75            Self::Comment => UniversalTokenRole::Comment,
76            Self::Eof => UniversalTokenRole::Eof,
77            Self::Error => UniversalTokenRole::Error,
78            _ => UniversalTokenRole::None,
79        }
80    }
81}