Skip to main content

oak_nginx/lexer/
token_type.rs

1use oak_core::{Token, TokenType, UniversalTokenRole};
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5/// Represents a token in an Nginx configuration file.
6pub type NginxToken = Token<NginxTokenType>;
7
8/// Token types for Nginx configuration.
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
10#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
11pub enum NginxTokenType {
12    /// The root of the configuration.
13    Root,
14    /// A configuration directive (e.g., `worker_processes 1;`).
15    Directive,
16    /// A configuration block (e.g., `server { ... }`).
17    Block,
18    /// A parameter within a directive.
19    Parameter,
20    /// A value within a directive or parameter.
21    Value,
22    /// A comment.
23    Comment,
24
25    /// The `server` keyword.
26    ServerKeyword, // server
27    /// The `location` keyword.
28    LocationKeyword, // location
29    /// The `upstream` keyword.
30    UpstreamKeyword, // upstream
31    /// The `http` keyword.
32    HttpKeyword, // http
33    /// The `events` keyword.
34    EventsKeyword, // events
35    /// The `listen` keyword.
36    ListenKeyword, // listen
37    /// The `server_name` keyword.
38    ServerNameKeyword, // server_name
39    /// The `root` keyword.
40    RootKeyword, // root
41    /// The `index` keyword.
42    IndexKeyword, // index
43    /// The `proxy_pass` keyword.
44    ProxyPassKeyword, // proxy_pass
45
46    /// Left brace `{`.
47    LeftBrace, // {
48    /// Right brace `}`.
49    RightBrace, // }
50    /// Semicolon `;`.
51    Semicolon, // ;
52
53    /// An identifier.
54    Identifier,
55    /// A string literal.
56    String,
57    /// A numeric literal.
58    Number,
59    /// A file path.
60    Path,
61    /// A URL.
62    Url,
63
64    /// Whitespace characters.
65    Whitespace,
66    /// Newline characters.
67    Newline,
68    /// A comment token.
69    CommentToken,
70    /// End of stream.
71    Eof,
72    /// An error token.
73    Error,
74}
75
76impl NginxTokenType {
77    /// Returns true if the token type represents a structural element.
78    pub fn is_element(&self) -> bool {
79        matches!(self, Self::Root | Self::Directive | Self::Block | Self::Parameter | Self::Value | Self::Comment)
80    }
81
82    /// Returns true if the token type represents a lexical token.
83    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}