oak_nginx/lexer/
token_type.rs1use oak_core::{Token, TokenRole, TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5pub type NginxToken = Token<NginxTokenType>;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
9pub enum NginxTokenType {
10 Root,
12 Directive,
13 Block,
14 Parameter,
15 Value,
16 Comment,
17
18 ServerKeyword, LocationKeyword, UpstreamKeyword, HttpKeyword, EventsKeyword, ListenKeyword, ServerNameKeyword, RootKeyword, IndexKeyword, ProxyPassKeyword, LeftBrace, RightBrace, Semicolon, Identifier,
37 String,
38 Number,
39 Path,
40 Url,
41
42 Whitespace,
44 Newline,
45 CommentToken,
46 Eof,
47 Error,
48}
49
50impl NginxTokenType {
51 pub fn is_element(&self) -> bool {
52 matches!(self, Self::Root | Self::Directive | Self::Block | Self::Parameter | Self::Value | Self::Comment)
53 }
54
55 pub fn is_token(&self) -> bool {
56 !self.is_element()
57 }
58}
59
60impl TokenType for NginxTokenType {
61 type Role = UniversalTokenRole;
62 const END_OF_STREAM: Self = Self::Eof;
63
64 fn role(&self) -> Self::Role {
65 match self {
66 Self::ServerKeyword | Self::LocationKeyword | Self::UpstreamKeyword | Self::HttpKeyword | Self::EventsKeyword | Self::ListenKeyword | Self::ServerNameKeyword | Self::RootKeyword | Self::IndexKeyword | Self::ProxyPassKeyword => {
67 UniversalTokenRole::Keyword
68 }
69
70 Self::LeftBrace | Self::RightBrace | Self::Semicolon => UniversalTokenRole::Punctuation,
71
72 Self::Identifier => UniversalTokenRole::Name,
73 Self::String | Self::Number | Self::Path | Self::Url => UniversalTokenRole::Literal,
74
75 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
76 Self::CommentToken => UniversalTokenRole::Comment,
77 Self::Error => UniversalTokenRole::Error,
78 _ => UniversalTokenRole::None,
79 }
80 }
81}