oak_toml/lexer/token_type.rs
1use oak_core::{TokenType, UniversalTokenRole};
2
3/// Represents the different types of tokens in the TOML language.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
6pub enum TomlTokenKind {
7 /// Spaces, tabs, and other non-newline whitespace.
8 Whitespace,
9 /// Newline characters (\n or \r\n).
10 Newline,
11 /// TOML comments starting with #.
12 Comment,
13
14 // Literals
15 /// A generic string literal.
16 String,
17 /// A basic string with escape sequences (surrounded by ").
18 BasicString,
19 /// A literal string without escape sequences (surrounded by ').
20 LiteralString,
21 /// An integer literal.
22 Integer,
23 /// A floating-point literal.
24 Float,
25 /// A boolean literal (true or false).
26 Boolean,
27 /// An RFC 3339 offset date-time.
28 OffsetDateTime,
29 /// A local date-time without offset.
30 LocalDateTime,
31 /// A local date without time.
32 LocalDate,
33 /// A local time without date.
34 LocalTime,
35
36 // Keywords/Identifiers
37 /// A generic identifier.
38 Identifier,
39 /// A bare key used in key-value pairs.
40 BareKey,
41
42 // Symbols
43 /// The equals sign (=) used for assignment.
44 Equal, // =
45 /// The dot (.) used for nested keys.
46 Dot, // .
47 /// The comma (,) used as a separator in arrays or inline tables.
48 Comma, // ,
49 /// The left brace ({) for inline tables.
50 LeftBrace, // {
51 /// The right brace (}) for inline tables.
52 RightBrace, // }
53 /// The left bracket ([) for arrays or tables.
54 LeftBracket, // [
55 /// The right bracket (]) for arrays or tables.
56 RightBracket, // ]
57 /// Double left brackets ([[) for array of tables.
58 DoubleLeftBracket,
59 /// Double right brackets (]]) for array of tables.
60 DoubleRightBracket,
61
62 // Internal
63 /// Represents a lexing error.
64 Error,
65 /// Represents the end of the source stream.
66 Eof,
67 /// Represents the root of the TOML document.
68 Root,
69}
70
71/// Alias for `TomlTokenKind` to conform to Oak's naming conventions.
72pub type TomlTokenType = TomlTokenKind;
73
74impl TokenType for TomlTokenKind {
75 type Role = UniversalTokenRole;
76 const END_OF_STREAM: Self = Self::Eof;
77
78 fn role(&self) -> Self::Role {
79 match self {
80 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
81 Self::Comment => UniversalTokenRole::Comment,
82 Self::BasicString | Self::LiteralString | Self::String | Self::Integer | Self::Float | Self::Boolean | Self::OffsetDateTime | Self::LocalDateTime | Self::LocalDate | Self::LocalTime => UniversalTokenRole::Literal,
83 Self::BareKey | Self::Identifier => UniversalTokenRole::Name,
84 Self::Equal | Self::Dot | Self::Comma | Self::LeftBrace | Self::RightBrace | Self::LeftBracket | Self::RightBracket | Self::DoubleLeftBracket | Self::DoubleRightBracket => UniversalTokenRole::Punctuation,
85 Self::Root => UniversalTokenRole::None,
86 Self::Error => UniversalTokenRole::Error,
87 Self::Eof => UniversalTokenRole::None,
88 }
89 }
90}