use oak_core::{ElementType, UniversalElementRole};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[repr(u8)]
pub enum WatElementType {
Whitespace,
Newline,
Comment,
Error,
Eof,
Text,
IntegerLiteral,
FloatLiteral,
StringLiteral,
Identifier,
ModuleKw,
FuncKw,
ExportKw,
ImportKw,
TypeKw,
ParamKw,
ResultKw,
LocalKw,
GlobalKw,
MemoryKw,
TableKw,
ElemKw,
DataKw,
StartKw,
BlockKw,
LoopKw,
IfKw,
ThenKw,
ElseKw,
EndKw,
BrKw,
BrIfKw,
BrTableKw,
ReturnKw,
CallKw,
CallIndirectKw,
LocalGetKw,
LocalSetKw,
LocalTeeKw,
GlobalGetKw,
GlobalSetKw,
I32LoadKw,
I64LoadKw,
F32LoadKw,
F64LoadKw,
I32Load8SKw,
I32Load8UKw,
I32Load16SKw,
I32Load16UKw,
I64Load8SKw,
I64Load8UKw,
I64Load16SKw,
I64Load16UKw,
I64Load32SKw,
I64Load32UKw,
I32StoreKw,
I64StoreKw,
F32StoreKw,
F64StoreKw,
I32Store8Kw,
I32Store16Kw,
I64Store8Kw,
I64Store16Kw,
I64Store32Kw,
MemorySizeKw,
MemoryGrowKw,
I32ConstKw,
I64ConstKw,
F32ConstKw,
F64ConstKw,
I32AddKw,
I64AddKw,
F32AddKw,
F64AddKw,
I32SubKw,
I64SubKw,
F32SubKw,
F64SubKw,
I32MulKw,
I64MulKw,
F32MulKw,
F64MulKw,
I32DivSKw,
I32DivUKw,
I64DivSKw,
I64DivUKw,
F32DivKw,
F64DivKw,
I32RemSKw,
I32RemUKw,
I64RemSKw,
I64RemUKw,
I32AndKw,
I64AndKw,
I32OrKw,
I64OrKw,
I32XorKw,
I64XorKw,
I32ShlKw,
I64ShlKw,
I32ShrSKw,
I32ShrUKw,
I64ShrSKw,
I64ShrUKw,
I32RotlKw,
I64RotlKw,
I32RotrKw,
I64RotrKw,
I32EqKw,
I64EqKw,
F32EqKw,
F64EqKw,
I32NeKw,
I64NeKw,
F32NeKw,
F64NeKw,
I32LtSKw,
I32LtUKw,
I64LtSKw,
I64LtUKw,
F32LtKw,
F64LtKw,
I32GtSKw,
I32GtUKw,
I64GtSKw,
I64GtUKw,
F32GtKw,
F64GtKw,
I32LeSKw,
I32LeUKw,
I64LeSKw,
I64LeUKw,
F32LeKw,
F64LeKw,
I32GeSKw,
I32GeUKw,
I64GeSKw,
I64GeUKw,
F32GeKw,
F64GeKw,
LeftParen,
RightParen,
Module,
Func,
Export,
Import,
Type,
Param,
Result,
Local,
Global,
Memory,
Table,
Elem,
Data,
Start,
Block,
Loop,
If,
Instruction,
Root,
Item,
}
impl WatElementType {
pub fn from_keyword(text: &str) -> Option<Self> {
match text {
"module" => Some(Self::ModuleKw),
"func" => Some(Self::FuncKw),
"export" => Some(Self::ExportKw),
"import" => Some(Self::ImportKw),
"type" => Some(Self::TypeKw),
"param" => Some(Self::ParamKw),
"result" => Some(Self::ResultKw),
"local" => Some(Self::LocalKw),
"global" => Some(Self::GlobalKw),
"memory" => Some(Self::MemoryKw),
"table" => Some(Self::TableKw),
"elem" => Some(Self::ElemKw),
"data" => Some(Self::DataKw),
"start" => Some(Self::StartKw),
"block" => Some(Self::BlockKw),
"loop" => Some(Self::LoopKw),
"if" => Some(Self::IfKw),
"then" => Some(Self::ThenKw),
"else" => Some(Self::ElseKw),
"end" => Some(Self::EndKw),
_ => None,
}
}
}
impl ElementType for WatElementType {
type Role = UniversalElementRole;
fn role(&self) -> Self::Role {
match self {
Self::Root => UniversalElementRole::Root,
Self::Error => UniversalElementRole::Error,
Self::Module => UniversalElementRole::Definition,
Self::Func => UniversalElementRole::Definition,
_ => UniversalElementRole::None,
}
}
}
impl From<crate::lexer::token_type::WatTokenType> for WatElementType {
fn from(token: crate::lexer::token_type::WatTokenType) -> Self {
unsafe { std::mem::transmute(token) }
}
}