1use oak_core::{ElementType, TokenType, UniversalElementRole, UniversalTokenRole};
2use serde::{Deserialize, Serialize};
3
4#[derive(Copy, Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)]
5pub enum XmlSyntaxKind {
6 Root,
8 Whitespace,
9 Newline,
10 Comment,
11 Text,
12 Error,
13 Eof,
14
15 XmlDeclaration,
17 DoctypeDeclaration,
18 ProcessingInstruction,
19 CData,
20
21 StartTag,
23 EndTag,
24 SelfClosingTag,
25 TagName,
26
27 AttributeName,
28 AttributeValue,
29
30 StringLiteral,
32
33 LeftAngle, RightAngle, LeftAngleSlash, SlashRightAngle, Equals, Quote, SingleQuote, Exclamation, Question, Ampersand, Semicolon, EntityReference,
48 CharacterReference,
49
50 Identifier,
52
53 SourceFile,
55 Element,
56 Attribute,
57 Prolog,
58}
59
60impl TokenType for XmlSyntaxKind {
61 const END_OF_STREAM: Self = Self::Eof;
62 type Role = UniversalTokenRole;
63
64 fn role(&self) -> Self::Role {
65 match self {
66 Self::Whitespace | Self::Newline => UniversalTokenRole::Whitespace,
67 Self::Comment => UniversalTokenRole::Comment,
68 Self::Eof => UniversalTokenRole::Eof,
69 _ => UniversalTokenRole::None,
70 }
71 }
72}
73
74impl ElementType for XmlSyntaxKind {
75 type Role = UniversalElementRole;
76
77 fn role(&self) -> Self::Role {
78 match self {
79 Self::SourceFile => UniversalElementRole::Root,
80 Self::Element => UniversalElementRole::Container,
81 Self::Attribute => UniversalElementRole::Detail,
82 Self::Prolog => UniversalElementRole::Detail,
83 Self::StartTag | Self::EndTag | Self::SelfClosingTag => UniversalElementRole::Detail,
84 Self::Comment => UniversalElementRole::None,
85 Self::Error => UniversalElementRole::Error,
86 _ => UniversalElementRole::None,
87 }
88 }
89
90 fn is_root(&self) -> bool {
91 matches!(self, Self::SourceFile)
92 }
93
94 fn is_error(&self) -> bool {
95 matches!(self, Self::Error)
96 }
97}