Skip to main content

oak_ini/kind/
mod.rs

1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
5pub enum IniSyntaxKind {
6    // Basic kinds
7    Whitespace,
8    Newline,
9    Comment,
10    Error,
11    Eof,
12
13    // Structures
14    Root,
15    Document,
16    Table,
17    ArrayOfTables,
18    Array,
19    InlineTable,
20    KeyValue,
21    Key,
22    Value,
23
24    // Tokens
25    LeftBrace,          // {
26    RightBrace,         // }
27    LeftBracket,        // [
28    RightBracket,       // ]
29    DoubleLeftBracket,  // [[
30    DoubleRightBracket, // ]]
31    Comma,              // ,
32    Dot,                // .
33    Equal,              // =
34
35    // Values
36    Identifier,
37    String,
38    Integer,
39    Float,
40    Boolean,
41    DateTime,
42}
43
44impl IniSyntaxKind {
45    pub fn is_trivia(&self) -> bool {
46        matches!(self, Self::Whitespace | Self::Newline | Self::Comment)
47    }
48}
49
50impl TokenType for IniSyntaxKind {
51    const END_OF_STREAM: Self = Self::Eof;
52    type Role = UniversalTokenRole;
53
54    fn role(&self) -> Self::Role {
55        match self {
56            Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
57            Self::Comment => UniversalTokenRole::Comment,
58            Self::Eof => UniversalTokenRole::Eof,
59            Self::LeftBrace | Self::RightBrace | Self::LeftBracket | Self::RightBracket | Self::DoubleLeftBracket | Self::DoubleRightBracket | Self::Comma | Self::Dot | Self::Equal => UniversalTokenRole::Punctuation,
60            Self::Identifier => UniversalTokenRole::Name,
61            Self::String | Self::Integer | Self::Float | Self::Boolean | Self::DateTime => UniversalTokenRole::Literal,
62            _ => UniversalTokenRole::None,
63        }
64    }
65}
66
67impl ElementType for IniSyntaxKind {
68    type Role = UniversalElementRole;
69
70    fn role(&self) -> Self::Role {
71        match self {
72            Self::Root | Self::Document => UniversalElementRole::Root,
73            Self::Table | Self::ArrayOfTables | Self::Array | Self::InlineTable => UniversalElementRole::Container,
74            Self::KeyValue => UniversalElementRole::Statement,
75            Self::Key => UniversalElementRole::Name,
76            Self::Value => UniversalElementRole::Value,
77            Self::String | Self::Integer | Self::Float | Self::Boolean | Self::DateTime => UniversalElementRole::Value,
78            Self::Error => UniversalElementRole::Error,
79            _ => UniversalElementRole::None,
80        }
81    }
82
83    fn is_root(&self) -> bool {
84        matches!(self, Self::Root | Self::Document)
85    }
86
87    fn is_error(&self) -> bool {
88        matches!(self, Self::Error)
89    }
90}