oak_dot/kind/
mod.rs

1use oak_core::{ElementType, Token, TokenType, UniversalElementRole, UniversalTokenRole};
2
3pub type DotToken = Token<DotSyntaxKind>;
4
5/// DOT 语法种类(Graphviz
6#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, serde::Serialize)]
7pub enum DotSyntaxKind {
8    // 基本 kind
9    Identifier,
10    String,
11    Number,
12    Whitespace,
13    Newline,
14
15    // DOT 关键字
16    Graph,
17    Digraph,
18    Subgraph,
19    Node,
20    Edge,
21    Strict,
22
23    // 操作符
24    Arrow,     // ->
25    Line,      // --
26    Equal,     // =
27    Semicolon, // ;
28    Comma,     // ,
29
30    // 分隔符
31    LeftBrace,    // {
32    RightBrace,   // }
33    LeftBracket,  // [
34    RightBracket, // ]
35    LeftParen,    // (
36    RightParen,   // )
37
38    // 注释
39    Comment,
40
41    // 特殊
42    Root,
43    Error,
44    Eof,
45}
46
47impl TokenType for DotSyntaxKind {
48    const END_OF_STREAM: Self = Self::Eof;
49    type Role = UniversalTokenRole;
50
51    fn role(&self) -> Self::Role {
52        match self {
53            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
54            Self::Comment => UniversalTokenRole::Comment,
55            Self::Eof => UniversalTokenRole::Eof,
56            Self::Graph | Self::Digraph | Self::Subgraph | Self::Node | Self::Edge | Self::Strict => UniversalTokenRole::Keyword,
57            Self::Identifier => UniversalTokenRole::Name,
58            Self::String => UniversalTokenRole::Literal,
59            Self::Number => UniversalTokenRole::Literal,
60            Self::Arrow | Self::Line | Self::Equal => UniversalTokenRole::Operator,
61            Self::Semicolon | Self::Comma | Self::LeftBrace | Self::RightBrace | Self::LeftBracket | Self::RightBracket | Self::LeftParen | Self::RightParen => UniversalTokenRole::Punctuation,
62            _ => UniversalTokenRole::None,
63        }
64    }
65
66    fn is_comment(&self) -> bool {
67        matches!(self, Self::Comment)
68    }
69
70    fn is_whitespace(&self) -> bool {
71        matches!(self, Self::Whitespace | Self::Newline)
72    }
73}
74
75impl ElementType for DotSyntaxKind {
76    type Role = UniversalElementRole;
77
78    fn role(&self) -> Self::Role {
79        match self {
80            Self::Root => UniversalElementRole::Root,
81            Self::Error => UniversalElementRole::Error,
82            _ => UniversalElementRole::None,
83        }
84    }
85
86    fn is_error(&self) -> bool {
87        matches!(self, Self::Error)
88    }
89}