1use oak_core::{ElementType, UniversalElementRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
6#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
7pub enum SchemeElementType {
8 SourceFile,
9 Whitespace,
10 Newline,
11 Comment,
12 LineComment,
13 NumberLiteral,
14 StringLiteral,
15 CharacterLiteral,
16 BooleanLiteral,
17 Identifier,
18 Symbol,
19 Keyword,
20 Define,
21 Lambda,
22 If,
23 Cond,
24 Case,
25 Let,
26 LetStar,
27 Letrec,
28 Begin,
29 Do,
30 Quote,
31 Quasiquote,
32 Unquote,
33 UnquoteSplicing,
34 And,
35 Or,
36 Not,
37 Set,
38 LeftParen,
39 RightParen,
40 LeftBracket,
41 RightBracket,
42 LeftBrace,
43 RightBrace,
44 Dot,
45 Hash,
46 Quote_,
47 Quasiquote_,
48 Unquote_,
49 UnquoteSplicing_,
50 Error,
51 Eof,
52}
53
54impl ElementType for SchemeElementType {
55 type Role = UniversalElementRole;
56
57 fn role(&self) -> Self::Role {
58 match self {
59 Self::SourceFile => UniversalElementRole::Root,
60 Self::Error => UniversalElementRole::Error,
61 _ => UniversalElementRole::None,
62 }
63 }
64}
65
66impl From<crate::lexer::token_type::SchemeTokenType> for SchemeElementType {
67 fn from(token: crate::lexer::token_type::SchemeTokenType) -> Self {
68 use crate::lexer::token_type::SchemeTokenType as T;
69 match token {
70 T::SourceFile => SchemeElementType::SourceFile,
71 T::Whitespace => SchemeElementType::Whitespace,
72 T::Newline => SchemeElementType::Newline,
73 T::Comment => SchemeElementType::Comment,
74 T::LineComment => SchemeElementType::LineComment,
75 T::NumberLiteral => SchemeElementType::NumberLiteral,
76 T::StringLiteral => SchemeElementType::StringLiteral,
77 T::CharacterLiteral => SchemeElementType::CharacterLiteral,
78 T::BooleanLiteral => SchemeElementType::BooleanLiteral,
79 T::Identifier => SchemeElementType::Identifier,
80 T::Symbol => SchemeElementType::Symbol,
81 T::Keyword => SchemeElementType::Keyword,
82 T::Define => SchemeElementType::Define,
83 T::Lambda => SchemeElementType::Lambda,
84 T::If => SchemeElementType::If,
85 T::Cond => SchemeElementType::Cond,
86 T::Case => SchemeElementType::Case,
87 T::Let => SchemeElementType::Let,
88 T::LetStar => SchemeElementType::LetStar,
89 T::Letrec => SchemeElementType::Letrec,
90 T::Begin => SchemeElementType::Begin,
91 T::Do => SchemeElementType::Do,
92 T::Quote => SchemeElementType::Quote,
93 T::Quasiquote => SchemeElementType::Quasiquote,
94 T::Unquote => SchemeElementType::Unquote,
95 T::UnquoteSplicing => SchemeElementType::UnquoteSplicing,
96 T::And => SchemeElementType::And,
97 T::Or => SchemeElementType::Or,
98 T::Not => SchemeElementType::Not,
99 T::Set => SchemeElementType::Set,
100 T::LeftParen => SchemeElementType::LeftParen,
101 T::RightParen => SchemeElementType::RightParen,
102 T::LeftBracket => SchemeElementType::LeftBracket,
103 T::RightBracket => SchemeElementType::RightBracket,
104 T::LeftBrace => SchemeElementType::LeftBrace,
105 T::RightBrace => SchemeElementType::RightBrace,
106 T::Dot => SchemeElementType::Dot,
107 T::Hash => SchemeElementType::Hash,
108 T::Quote_ => SchemeElementType::Quote_,
109 T::Quasiquote_ => SchemeElementType::Quasiquote_,
110 T::Unquote_ => SchemeElementType::Unquote_,
111 T::UnquoteSplicing_ => SchemeElementType::UnquoteSplicing_,
112 T::Error => SchemeElementType::Error,
113 T::Eof => SchemeElementType::Eof,
114 }
115 }
116}