oak_nginx/lexer/
token_type.rs1use oak_core::{Token, TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5pub type NginxToken = Token<NginxTokenType>;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub enum NginxTokenType {
12 Root,
14 Directive,
16 Block,
18 Parameter,
20 Value,
22 Comment,
24
25 ServerKeyword, LocationKeyword, UpstreamKeyword, HttpKeyword, EventsKeyword, ListenKeyword, ServerNameKeyword, RootKeyword, IndexKeyword, ProxyPassKeyword, LeftBrace, RightBrace, Semicolon, Identifier,
55 String,
57 Number,
59 Path,
61 Url,
63
64 Whitespace,
66 Newline,
68 CommentToken,
70 Eof,
72 Error,
74}
75
76impl NginxTokenType {
77 pub fn is_element(&self) -> bool {
79 matches!(self, Self::Root | Self::Directive | Self::Block | Self::Parameter | Self::Value | Self::Comment)
80 }
81
82 pub fn is_token(&self) -> bool {
84 !self.is_element()
85 }
86}
87
88impl TokenType for NginxTokenType {
89 type Role = UniversalTokenRole;
90 const END_OF_STREAM: Self = Self::Eof;
91
92 fn role(&self) -> Self::Role {
93 match self {
94 Self::ServerKeyword | Self::LocationKeyword | Self::UpstreamKeyword | Self::HttpKeyword | Self::EventsKeyword | Self::ListenKeyword | Self::ServerNameKeyword | Self::RootKeyword | Self::IndexKeyword | Self::ProxyPassKeyword => {
95 UniversalTokenRole::Keyword
96 }
97
98 Self::LeftBrace | Self::RightBrace | Self::Semicolon => UniversalTokenRole::Punctuation,
99
100 Self::Identifier => UniversalTokenRole::Name,
101 Self::String | Self::Number | Self::Path | Self::Url => UniversalTokenRole::Literal,
102
103 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
104 Self::CommentToken => UniversalTokenRole::Comment,
105 Self::Error => UniversalTokenRole::Error,
106 _ => UniversalTokenRole::None,
107 }
108 }
109}