use oak_core::{Token, TokenType, UniversalTokenRole};
pub type NginxToken = Token<NginxTokenType>;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum NginxTokenType {
Root,
Directive,
Block,
Parameter,
Value,
Comment,
ServerKeyword, LocationKeyword, UpstreamKeyword, HttpKeyword, EventsKeyword, ListenKeyword, ServerNameKeyword, RootKeyword, IndexKeyword, ProxyPassKeyword,
LeftBrace, RightBrace, Semicolon,
Identifier,
String,
Number,
Path,
Url,
Whitespace,
Newline,
CommentToken,
Eof,
Error,
}
impl NginxTokenType {
pub fn is_element(&self) -> bool {
matches!(self, Self::Root | Self::Directive | Self::Block | Self::Parameter | Self::Value | Self::Comment)
}
pub fn is_token(&self) -> bool {
!self.is_element()
}
}
impl TokenType for NginxTokenType {
type Role = UniversalTokenRole;
const END_OF_STREAM: Self = Self::Eof;
fn role(&self) -> Self::Role {
match self {
Self::ServerKeyword | Self::LocationKeyword | Self::UpstreamKeyword | Self::HttpKeyword | Self::EventsKeyword | Self::ListenKeyword | Self::ServerNameKeyword | Self::RootKeyword | Self::IndexKeyword | Self::ProxyPassKeyword => {
UniversalTokenRole::Keyword
}
Self::LeftBrace | Self::RightBrace | Self::Semicolon => UniversalTokenRole::Punctuation,
Self::Identifier => UniversalTokenRole::Name,
Self::String | Self::Number | Self::Path | Self::Url => UniversalTokenRole::Literal,
Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
Self::CommentToken => UniversalTokenRole::Comment,
Self::Error => UniversalTokenRole::Error,
_ => UniversalTokenRole::None,
}
}
}