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