Skip to main content

oak_json/lexer/
token_type.rs

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