Skip to main content

oak_clojure/lexer/
token_type.rs

1/// Token type definitions for Clojure lexer.
2use oak_core::{Source, Token, TokenType, UniversalElementRole, UniversalTokenRole};
3
4/// Type alias for a Clojure token.
5pub type ClojureToken = Token<ClojureTokenType>;
6
7/// Token types for Clojure.
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10pub enum ClojureTokenType {
11    /// Generic token.
12    Token,
13    /// List node.
14    List,
15    /// Vector node.
16    Vector,
17    /// Map node.
18    Map,
19    /// Set node.
20    Set,
21    /// Anonymous function node.
22    AnonFn,
23    /// Root node.
24    Root,
25    /// Source file node.
26    SourceFile,
27    /// Error token.
28    Error,
29    // Lexer tokens
30    /// `(`
31    ListStart,
32    /// `)`
33    ListEnd,
34    /// `[`
35    VectorStart,
36    /// `]`
37    VectorEnd,
38    /// `{`
39    MapStart,
40    /// `}`
41    MapEnd,
42    /// `#{`
43    SetStart,
44    /// `#(`
45    AnonFnStart,
46    /// `'`
47    Quote,
48    /// `~`
49    Unquote,
50    /// `~@`
51    UnquoteSplice,
52    /// `^`
53    Meta,
54    /// Whitespace.
55    Whitespace,
56    /// Comment.
57    Comment,
58    /// String literal.
59    StringLiteral,
60    /// Character literal.
61    CharacterLiteral,
62    /// Number literal.
63    NumberLiteral,
64    /// Keyword literal.
65    KeywordLiteral,
66    /// `#`
67    Dispatch,
68    /// Regex literal.
69    RegexLiteral,
70    /// Symbol.
71    Symbol,
72}
73
74impl TokenType for ClojureTokenType {
75    type Role = UniversalTokenRole;
76    const END_OF_STREAM: Self = Self::Error;
77
78    fn is_ignored(&self) -> bool {
79        false
80    }
81
82    fn role(&self) -> Self::Role {
83        match self {
84            Self::Error => UniversalTokenRole::Error,
85            _ => UniversalTokenRole::None,
86        }
87    }
88}