oak_dot/parser/element_type.rs
1//! Element types for the DOT language.
2use oak_core::{ElementType, UniversalElementRole};
3
4/// Element types for the DOT language.
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7#[repr(u8)]
8pub enum DotElementType {
9 // Basic kind
10 /// An identifier.
11 Identifier,
12 /// A string literal.
13 String,
14 /// A number literal.
15 Number,
16 /// Whitespace.
17 Whitespace,
18 /// A newline.
19 Newline,
20
21 // DOT keywords
22 /// The `graph` keyword.
23 Graph,
24 /// The `digraph` keyword.
25 Digraph,
26 /// The `subgraph` keyword.
27 Subgraph,
28 /// The `node` keyword.
29 Node,
30 /// The `edge` keyword.
31 Edge,
32 /// The `strict` keyword.
33 Strict,
34
35 // Operators
36 /// The `->` arrow operator.
37 Arrow, // ->
38 /// The `--` line operator.
39 Line, // --
40 /// The `=` equal operator.
41 Equal, // =
42 /// The `;` semicolon.
43 Semicolon, // ;
44 /// The `,` comma.
45 Comma, // ,
46
47 // Delimiters
48 /// The `{` left brace.
49 LeftBrace, // {
50 /// The `}` right brace.
51 RightBrace, // }
52 /// The `[` left bracket.
53 LeftBracket, // [
54 /// The `]` right bracket.
55 RightBracket, // ]
56 /// The `(` left paren.
57 LeftParen, // (
58 /// The `)` right paren.
59 RightParen, // )
60
61 // Comments
62 /// A comment.
63 Comment,
64
65 // Special
66 /// The root element.
67 Root,
68 /// An error element.
69 Error,
70 /// End of stream marker.
71 Eof,
72}
73
74impl ElementType for DotElementType {
75 type Role = UniversalElementRole;
76
77 fn role(&self) -> Self::Role {
78 match self {
79 _ => UniversalElementRole::None,
80 }
81 }
82}
83
84impl From<crate::lexer::token_type::DotTokenType> for DotElementType {
85 fn from(token: crate::lexer::token_type::DotTokenType) -> Self {
86 unsafe { std::mem::transmute(token) }
87 }
88}