Skip to main content

oak_regex/kind/
mod.rs

1use oak_core::{ElementType, Token, TokenType, UniversalElementRole, UniversalTokenRole};
2use std::fmt::Display;
3
4pub type RegexToken = Token<RegexSyntaxKind>;
5
6#[allow(missing_docs)]
7#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash, serde::Serialize, serde::Deserialize)]
8#[repr(u16)]
9pub enum RegexSyntaxKind {
10    // Special Kinds
11    TOMBSTONE,
12    Eof,
13
14    // Regex pattern
15    RegexPattern,
16
17    // Alternation
18    Pipe,
19
20    // Quantifiers
21    Question,
22    Star,
23    Plus,
24    LBrace,
25    RBrace,
26    Comma,
27
28    // Groups
29    LParen,
30    RParen,
31
32    // Character classes
33    LBrack,
34    RBrack,
35    Hat,
36    Dash,
37
38    // Assertions
39    Dollar,
40
41    // Special characters
42    Dot,
43
44    // Escape character
45    Backslash,
46
47    // Characters
48    Character,
49    Digit,
50    Whitespace,
51
52    // Error and comments
53    Error,
54    Comment,
55}
56
57impl Display for RegexSyntaxKind {
58    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59        write!(f, "{:?}", self)
60    }
61}
62
63impl TokenType for RegexSyntaxKind {
64    const END_OF_STREAM: Self = Self::Eof;
65    type Role = UniversalTokenRole;
66
67    fn role(&self) -> Self::Role {
68        match self {
69            RegexSyntaxKind::Whitespace => UniversalTokenRole::Whitespace,
70            RegexSyntaxKind::Comment => UniversalTokenRole::Comment,
71            Self::Eof => UniversalTokenRole::Eof,
72            _ => UniversalTokenRole::None,
73        }
74    }
75}
76
77impl ElementType for RegexSyntaxKind {
78    type Role = UniversalElementRole;
79
80    fn role(&self) -> Self::Role {
81        match self {
82            Self::Error => UniversalElementRole::Error,
83            _ => UniversalElementRole::None,
84        }
85    }
86}