1use std::sync::Arc;
2
3use serde::{Deserialize, Serialize};
4
5use crate::SourceLocation;
6
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
8pub enum ScriptType {
9 Script,
10}
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
13#[serde(rename_all = "lowercase")]
14pub enum ScriptContext {
15 Default,
16 Module,
17}
18
19#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
20pub struct NameLocation {
21 pub start: SourceLocation,
22 pub end: SourceLocation,
23}
24
25#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
26pub enum DirectiveValueSyntax {
27 #[default]
28 Implicit,
29 Expression,
30 Invalid,
31}
32
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)]
34pub enum AttributeValueSyntax {
35 #[default]
36 Boolean,
37 Expression,
38 Quoted,
39 Unquoted,
40}
41
42#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
43pub enum AttrErrorKind {
44 InvalidName,
45 ExpectedEquals,
46 ExpectedValue,
47 HtmlTag,
48 Block(Arc<str>),
49}
50
51#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
52pub struct AttrError {
53 pub kind: AttrErrorKind,
54 pub start: usize,
55 pub end: usize,
56}
57
58#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
59pub enum SnippetHeaderErrorKind {
60 ExpectedRightBrace,
61 ExpectedRightParen,
62}
63
64#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
65pub struct SnippetHeaderError {
66 pub kind: SnippetHeaderErrorKind,
67 pub start: usize,
68 pub end: usize,
69}
70
71#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
72pub enum ParseErrorKind {
73 BlockInvalidContinuationPlacement,
74 ExpectedTokenElse,
75 ExpectedTokenAwaitBranch,
76 ExpectedTokenCommentClose,
77 ExpectedTokenStyleClose,
78 ExpectedTokenRightBrace,
79 ExpectedWhitespace,
80 BlockUnexpectedCharacter,
81 UnexpectedReservedWord { word: Arc<str> },
82 JsParseError { message: Arc<str> },
83 CssExpectedIdentifier,
84 UnexpectedEof,
85 BlockUnclosed,
86 ElementUnclosed { name: Arc<str> },
87 ElementInvalidClosingTag { name: Arc<str> },
88 ElementInvalidClosingTagAutoclosed { name: Arc<str>, reason: Arc<str> },
89}
90
91#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
92pub struct ParseError {
93 pub kind: ParseErrorKind,
94 pub start: usize,
95 pub end: usize,
96}
97
98#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
100pub struct JsComment {
101 pub kind: JsCommentKind,
102 pub value: Arc<str>,
103 pub start: usize,
104 pub end: usize,
105}
106
107#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
108pub enum JsCommentKind {
109 Line,
110 Block,
111}
112
113#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
114pub enum RootCommentType {
115 Line,
116 Block,
117}
118
119#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
120pub enum FragmentType {
121 Fragment,
122}
123
124#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
125#[serde(untagged)]
126pub enum LiteralValue {
127 String(Arc<str>),
128 Number(i64),
129 JsonNumber(serde_json::Number),
130 Bool(bool),
131 Null,
132}
133
134#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
135pub struct Loc {
136 pub start: Position,
137 pub end: Position,
138}
139
140#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
141pub struct Position {
142 pub line: usize,
143 pub column: usize,
144 #[serde(skip_serializing_if = "Option::is_none")]
145 pub character: Option<usize>,
146}
147
148pub trait Span {
149 fn start(&self) -> usize;
150 fn end(&self) -> usize;
151
152 #[allow(dead_code)]
153 fn len(&self) -> usize {
154 self.end().saturating_sub(self.start())
155 }
156
157 #[allow(dead_code)]
158 fn is_empty(&self) -> bool {
159 self.start() >= self.end()
160 }
161
162 #[allow(dead_code)]
163 fn contains(&self, offset: usize) -> bool {
164 offset >= self.start() && offset <= self.end()
165 }
166}