oak_apl/parser/
element_type.rs1use crate::lexer::token_type::AplTokenType;
2use oak_core::{ElementType, GreenNode, UniversalElementRole};
3use std::sync::Arc;
4
5pub type AplElement<'a> = Arc<GreenNode<'a, AplElementType>>;
7
8#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub enum AplElementType {
12 Root,
14 Statement,
16 Expression,
18 Assignment,
20 ArrayLiteral,
22 Function,
24 Operator,
26 Identifier,
28 NumberLiteral,
30 StringLiteral,
32 Error,
34}
35
36impl ElementType for AplElementType {
37 type Role = UniversalElementRole;
38
39 fn is_root(&self) -> bool {
40 matches!(self, Self::Root)
41 }
42
43 fn is_error(&self) -> bool {
44 matches!(self, Self::Error)
45 }
46
47 fn role(&self) -> Self::Role {
48 use UniversalElementRole::*;
49 match self {
50 Self::Root => Root,
51 Self::Statement => Statement,
52 Self::Expression | Self::ArrayLiteral | Self::Assignment => Expression,
53 Self::Function | Self::Operator => Definition,
54 Self::Identifier => Reference,
55 Self::NumberLiteral | Self::StringLiteral => Expression,
56 Self::Error => Error,
57 }
58 }
59}
60
61impl From<AplTokenType> for AplElementType {
62 fn from(token_type: AplTokenType) -> Self {
63 match token_type {
64 AplTokenType::Identifier => Self::Identifier,
65 AplTokenType::StringLiteral => Self::StringLiteral,
66 AplTokenType::NumberLiteral => Self::NumberLiteral,
67 _ => Self::Error,
68 }
69 }
70}