use std::fmt;
#[derive(Debug, Clone, PartialEq)]
pub enum TokenType {
Page,
Component,
Store,
App,
Router,
Route,
State,
Derived,
Effect,
Action,
Use,
Fetch,
From,
Navigate,
Log,
If,
Else,
For,
In,
Show,
Loading,
Error,
Success,
TypeString,
TypeNumber,
TypeBool,
TypeList,
TypeMap,
StringLiteral(String),
NumberLiteral(f64),
BoolLiteral(bool),
Null,
Container,
Row,
Column,
Grid,
Stack,
Spacer,
Divider,
Navbar,
Sidebar,
Breadcrumb,
Link,
Menu,
Tabs,
TabPage,
Card,
Table,
Thead,
Tbody,
Trow,
Tcell,
List,
Badge,
Avatar,
Tooltip,
Tag,
Input,
Select,
Option,
Checkbox,
Radio,
Switch,
Slider,
DatePicker,
FileUpload,
Form,
Alert,
Toast,
Modal,
Dialog,
Spinner,
Progress,
Skeleton,
Button,
IconButton,
ButtonGroup,
Dropdown,
Image,
Video,
Icon,
Carousel,
Text,
Heading,
Code,
Blockquote,
Document,
Section,
Paragraph,
PageBreak,
Header,
Footer,
Style,
Theme,
Token,
Animate,
Transition,
Identifier(String),
Plus,
Minus,
Star,
Slash,
Percent,
Equals,
DoubleEquals,
NotEquals,
LessThan,
GreaterThan,
LessEquals,
GreaterEquals,
And,
Or,
Not,
Dot,
Arrow,
OpenParen,
CloseParen,
OpenBrace,
CloseBrace,
OpenBracket,
CloseBracket,
Colon,
Comma,
QuestionMark,
Event(String),
Children,
EOF,
}
impl fmt::Display for TokenType {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TokenType::Page => write!(f, "Page"),
TokenType::Component => write!(f, "Component"),
TokenType::Store => write!(f, "Store"),
TokenType::App => write!(f, "App"),
TokenType::Router => write!(f, "Router"),
TokenType::Route => write!(f, "Route"),
TokenType::State => write!(f, "state"),
TokenType::Derived => write!(f, "derived"),
TokenType::Effect => write!(f, "effect"),
TokenType::Action => write!(f, "action"),
TokenType::Use => write!(f, "use"),
TokenType::Fetch => write!(f, "fetch"),
TokenType::From => write!(f, "from"),
TokenType::Navigate => write!(f, "navigate"),
TokenType::Log => write!(f, "log"),
TokenType::If => write!(f, "if"),
TokenType::Else => write!(f, "else"),
TokenType::For => write!(f, "for"),
TokenType::In => write!(f, "in"),
TokenType::Show => write!(f, "show"),
TokenType::Loading => write!(f, "loading"),
TokenType::Error => write!(f, "error"),
TokenType::Success => write!(f, "success"),
TokenType::StringLiteral(s) => write!(f, "\"{}\"", s),
TokenType::NumberLiteral(n) => write!(f, "{}", n),
TokenType::BoolLiteral(b) => write!(f, "{}", b),
TokenType::Null => write!(f, "null"),
TokenType::Identifier(s) => write!(f, "{}", s),
TokenType::Event(s) => write!(f, "on:{}", s),
TokenType::EOF => write!(f, "EOF"),
TokenType::TypeList => write!(f, "List"),
other => write!(f, "{:?}", other),
}
}
}
#[derive(Debug, Clone)]
pub struct Token {
pub token_type: TokenType,
pub line: usize,
pub column: usize,
}
impl Token {
pub fn new(token_type: TokenType, line: usize, column: usize) -> Self {
Self {
token_type,
line,
column,
}
}
}
pub fn keyword_or_identifier(word: &str) -> TokenType {
match word {
"Page" => TokenType::Page,
"Component" => TokenType::Component,
"Store" => TokenType::Store,
"App" => TokenType::App,
"Router" => TokenType::Router,
"Route" => TokenType::Route,
"state" => TokenType::State,
"derived" => TokenType::Derived,
"effect" => TokenType::Effect,
"action" => TokenType::Action,
"use" => TokenType::Use,
"fetch" => TokenType::Fetch,
"from" => TokenType::From,
"navigate" => TokenType::Navigate,
"log" => TokenType::Log,
"if" => TokenType::If,
"else" => TokenType::Else,
"for" => TokenType::For,
"in" => TokenType::In,
"show" => TokenType::Show,
"loading" => TokenType::Loading,
"error" => TokenType::Error,
"success" => TokenType::Success,
"String" => TokenType::TypeString,
"Number" => TokenType::TypeNumber,
"Bool" => TokenType::TypeBool,
"List" => TokenType::TypeList,
"Map" => TokenType::TypeMap,
"true" => TokenType::BoolLiteral(true),
"false" => TokenType::BoolLiteral(false),
"null" => TokenType::Null,
"Container" => TokenType::Container,
"Row" => TokenType::Row,
"Column" => TokenType::Column,
"Grid" => TokenType::Grid,
"Stack" => TokenType::Stack,
"Spacer" => TokenType::Spacer,
"Divider" => TokenType::Divider,
"Navbar" => TokenType::Navbar,
"Sidebar" => TokenType::Sidebar,
"Breadcrumb" => TokenType::Breadcrumb,
"Link" => TokenType::Link,
"Menu" => TokenType::Menu,
"Tabs" => TokenType::Tabs,
"TabPage" => TokenType::TabPage,
"Card" => TokenType::Card,
"Table" => TokenType::Table,
"Thead" => TokenType::Thead,
"Tbody" => TokenType::Tbody,
"Trow" => TokenType::Trow,
"Tcell" => TokenType::Tcell,
"Badge" => TokenType::Badge,
"Avatar" => TokenType::Avatar,
"Tooltip" => TokenType::Tooltip,
"Tag" => TokenType::Tag,
"Input" => TokenType::Input,
"Select" => TokenType::Select,
"Option" => TokenType::Option,
"Checkbox" => TokenType::Checkbox,
"Radio" => TokenType::Radio,
"Switch" => TokenType::Switch,
"Slider" => TokenType::Slider,
"DatePicker" => TokenType::DatePicker,
"FileUpload" => TokenType::FileUpload,
"Form" => TokenType::Form,
"Alert" => TokenType::Alert,
"Toast" => TokenType::Toast,
"Modal" => TokenType::Modal,
"Dialog" => TokenType::Dialog,
"Spinner" => TokenType::Spinner,
"Progress" => TokenType::Progress,
"Skeleton" => TokenType::Skeleton,
"Button" => TokenType::Button,
"IconButton" => TokenType::IconButton,
"ButtonGroup" => TokenType::ButtonGroup,
"Dropdown" => TokenType::Dropdown,
"Image" => TokenType::Image,
"Video" => TokenType::Video,
"Icon" => TokenType::Icon,
"Carousel" => TokenType::Carousel,
"Text" => TokenType::Text,
"Heading" => TokenType::Heading,
"Code" => TokenType::Code,
"Blockquote" => TokenType::Blockquote,
"Document" => TokenType::Document,
"Section" => TokenType::Section,
"Paragraph" => TokenType::Paragraph,
"PageBreak" => TokenType::PageBreak,
"Header" => TokenType::Header,
"Footer" => TokenType::Footer,
"style" => TokenType::Style,
"Theme" => TokenType::Theme,
"token" => TokenType::Token,
"animate" => TokenType::Animate,
"transition" => TokenType::Transition,
"children" => TokenType::Children,
_ => TokenType::Identifier(word.to_string()),
}
}