Skip to main content

oak_clojure/lexer/
token_type.rs

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