Skip to main content

oak_cmd/lexer/
token_type.rs

1use oak_core::UniversalTokenRole;
2#[cfg(feature = "serde")]
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
6#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
7#[repr(u16)]
8/// Represents all possible token kinds in the Windows Command (CMD) scripting language.
9pub enum CmdTokenType {
10    /// Whitespace characters
11    Whitespace,
12    /// Newline characters
13    Newline,
14    /// Comments (starting with REM or ::)
15    Comment,
16    /// String literals
17    StringLiteral,
18    /// Variable references (e.g., %VAR%)
19    Variable,
20    /// Numeric literals
21    NumberLiteral,
22    /// Identifiers
23    Identifier,
24    /// CMD keywords (IF, FOR, SET, etc.)
25    Keyword,
26    /// Operators (==, EQU, NEQ, etc.)
27    Operator,
28    /// Delimiters
29    Delimiter,
30    /// Command names
31    Command,
32    /// Labels (starting with :)
33    Label,
34    /// Plain text content
35    Text,
36    /// Error token
37    Error,
38    /// End of file marker
39    Eof,
40}
41
42impl oak_core::TokenType for CmdTokenType {
43    const END_OF_STREAM: Self = Self::Eof;
44    type Role = UniversalTokenRole;
45
46    fn is_ignored(&self) -> bool {
47        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
48    }
49
50    fn is_comment(&self) -> bool {
51        matches!(self, Self::Comment)
52    }
53
54    fn is_whitespace(&self) -> bool {
55        matches!(self, Self::Whitespace | Self::Newline)
56    }
57
58    fn role(&self) -> Self::Role {
59        match self {
60            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
61            Self::Comment => UniversalTokenRole::Comment,
62            Self::Keyword => UniversalTokenRole::Keyword,
63            Self::Identifier | Self::Variable | Self::Command | Self::Label => UniversalTokenRole::Name,
64            Self::StringLiteral | Self::NumberLiteral => UniversalTokenRole::Literal,
65            Self::Operator => UniversalTokenRole::Operator,
66            Self::Delimiter => UniversalTokenRole::Punctuation,
67            Self::Eof => UniversalTokenRole::Eof,
68            Self::Error => UniversalTokenRole::Error,
69            _ => UniversalTokenRole::None,
70        }
71    }
72}