Skip to main content

oak_json/parser/
element_type.rs

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