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