1use duck_diagnostic::{DiagnosticCode, Severity};
16use serde::{Deserialize, Serialize};
17
18pub mod metadata;
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
36pub enum Code {
37 #[cfg(feature = "lexer")]
42 InvalidCharacter,
43 #[cfg(feature = "lexer")]
45 InvalidFrontMatter,
46 #[cfg(feature = "lexer")]
48 UnterminatedString,
49 #[cfg(feature = "lexer")]
51 UnterminatedExpression,
52 #[cfg(feature = "lexer")]
54 UnexpectedEof,
55 #[cfg(feature = "lexer")]
57 InvalidJsxSelfClosingTag,
58 #[cfg(feature = "lexer")]
60 UnterminatedJsxTag,
61 #[cfg(feature = "lexer")]
63 InvalidJsxClosingTag,
64 #[cfg(feature = "lexer")]
66 InvalidJsxAttribute,
67 #[cfg(feature = "lexer")]
69 UnterminatedCodeBlock,
70
71 #[cfg(feature = "lexer")]
73 EmptyFrontMatter,
74
75 #[cfg(feature = "parser")]
80 UnterminatedLink,
81 #[cfg(feature = "parser")]
83 UnterminatedImage,
84 #[cfg(feature = "parser")]
86 UnterminatedInlineCode,
87 #[cfg(feature = "parser")]
89 UnterminatedCodeBlockBlock,
90 #[cfg(feature = "parser")]
92 UnterminatedJsxOpenTag,
93 #[cfg(feature = "parser")]
95 UnterminatedJsxCloseTag,
96 #[cfg(feature = "parser")]
98 UnterminatedJsxExpression,
99 #[cfg(feature = "parser")]
101 UnterminatedMdComment,
102 #[cfg(feature = "parser")]
104 UnterminatedFrontmatter,
105 #[cfg(feature = "parser")]
107 MismatchedJsxCloseTag,
108 #[cfg(feature = "parser")]
110 TableShapeMismatch,
111 #[cfg(feature = "parser")]
113 StraySetextUnderline,
114 #[cfg(feature = "parser")]
116 MissingJsxAttributeValue,
117 #[cfg(feature = "parser")]
119 ListMarkerOverflow,
120
121 #[cfg(feature = "parser")]
123 EmptyFrontmatter,
124 #[cfg(feature = "parser")]
126 InvalidFrontmatterYaml,
127 #[cfg(feature = "parser")]
129 HeadingLevelClamped,
130 #[cfg(feature = "parser")]
132 RecoveredUnterminatedJsx,
133
134 #[cfg(feature = "transform")]
139 ImportFileNotFound,
140 #[cfg(feature = "transform")]
142 InvalidLineRange,
143 #[cfg(feature = "transform")]
145 RegistryIndexUnreadable,
146 #[cfg(feature = "transform")]
148 RegistryIndexMalformed,
149 #[cfg(feature = "transform")]
151 RegistryEntryNotFound,
152 #[cfg(feature = "transform")]
154 RegistrySourceUnreadable,
155 #[cfg(feature = "transform")]
157 ComponentSourceUnreadable,
158 #[cfg(feature = "transform")]
160 AssetCopyFailed,
161 #[cfg(feature = "transform")]
163 MermaidRenderFailed,
164
165 #[cfg(feature = "transform")]
167 MmdcUnavailable,
168 #[cfg(feature = "transform")]
170 MissingComponentAttr,
171 #[cfg(feature = "transform")]
173 AssetSourceMissing,
174 #[cfg(feature = "transform")]
178 BaseDirNotFound,
179
180 #[cfg(feature = "codegen")]
185 MalformedJsxTagName,
186
187 #[cfg(feature = "codegen")]
190 MdxTableUnsupported,
191 #[cfg(feature = "codegen")]
194 HtmlExpressionDropped,
195
196 Custom { code: String, severity: Severity },
203}
204
205impl DiagnosticCode for Code {
206 fn code(&self) -> &str {
207 match self {
208 #[cfg(feature = "lexer")]
210 Self::InvalidCharacter => "E001",
211 #[cfg(feature = "lexer")]
212 Self::InvalidFrontMatter => "E002",
213 #[cfg(feature = "lexer")]
214 Self::UnterminatedString => "E003",
215 #[cfg(feature = "lexer")]
216 Self::UnterminatedExpression => "E004",
217 #[cfg(feature = "lexer")]
218 Self::UnexpectedEof => "E005",
219 #[cfg(feature = "lexer")]
220 Self::InvalidJsxSelfClosingTag => "E006",
221 #[cfg(feature = "lexer")]
222 Self::UnterminatedJsxTag => "E007",
223 #[cfg(feature = "lexer")]
224 Self::InvalidJsxClosingTag => "E008",
225 #[cfg(feature = "lexer")]
226 Self::InvalidJsxAttribute => "E009",
227 #[cfg(feature = "lexer")]
228 Self::UnterminatedCodeBlock => "E010",
229 #[cfg(feature = "lexer")]
230 Self::EmptyFrontMatter => "W001",
231
232 #[cfg(feature = "parser")]
234 Self::UnterminatedLink => "P001",
235 #[cfg(feature = "parser")]
236 Self::UnterminatedImage => "P002",
237 #[cfg(feature = "parser")]
238 Self::UnterminatedInlineCode => "P003",
239 #[cfg(feature = "parser")]
240 Self::UnterminatedCodeBlockBlock => "P004",
241 #[cfg(feature = "parser")]
242 Self::UnterminatedJsxOpenTag => "P005",
243 #[cfg(feature = "parser")]
244 Self::UnterminatedJsxCloseTag => "P006",
245 #[cfg(feature = "parser")]
246 Self::UnterminatedJsxExpression => "P007",
247 #[cfg(feature = "parser")]
248 Self::UnterminatedMdComment => "P008",
249 #[cfg(feature = "parser")]
250 Self::UnterminatedFrontmatter => "P009",
251 #[cfg(feature = "parser")]
252 Self::MismatchedJsxCloseTag => "P010",
253 #[cfg(feature = "parser")]
254 Self::TableShapeMismatch => "P011",
255 #[cfg(feature = "parser")]
256 Self::StraySetextUnderline => "P012",
257 #[cfg(feature = "parser")]
258 Self::MissingJsxAttributeValue => "P013",
259 #[cfg(feature = "parser")]
260 Self::ListMarkerOverflow => "P014",
261 #[cfg(feature = "parser")]
262 Self::EmptyFrontmatter => "PW001",
263 #[cfg(feature = "parser")]
264 Self::InvalidFrontmatterYaml => "PW002",
265 #[cfg(feature = "parser")]
266 Self::HeadingLevelClamped => "PW003",
267 #[cfg(feature = "parser")]
268 Self::RecoveredUnterminatedJsx => "PW004",
269
270 #[cfg(feature = "transform")]
272 Self::ImportFileNotFound => "T001",
273 #[cfg(feature = "transform")]
274 Self::InvalidLineRange => "T002",
275 #[cfg(feature = "transform")]
276 Self::RegistryIndexUnreadable => "T003",
277 #[cfg(feature = "transform")]
278 Self::RegistryIndexMalformed => "T004",
279 #[cfg(feature = "transform")]
280 Self::RegistryEntryNotFound => "T005",
281 #[cfg(feature = "transform")]
282 Self::RegistrySourceUnreadable => "T006",
283 #[cfg(feature = "transform")]
284 Self::ComponentSourceUnreadable => "T007",
285 #[cfg(feature = "transform")]
286 Self::AssetCopyFailed => "T008",
287 #[cfg(feature = "transform")]
288 Self::MermaidRenderFailed => "T009",
289 #[cfg(feature = "transform")]
290 Self::MmdcUnavailable => "TW001",
291 #[cfg(feature = "transform")]
292 Self::MissingComponentAttr => "TW002",
293 #[cfg(feature = "transform")]
294 Self::AssetSourceMissing => "TW003",
295 #[cfg(feature = "transform")]
296 Self::BaseDirNotFound => "TW004",
297
298 #[cfg(feature = "codegen")]
299 Self::MalformedJsxTagName => "G001",
300 #[cfg(feature = "codegen")]
301 Self::MdxTableUnsupported => "GW001",
302 #[cfg(feature = "codegen")]
303 Self::HtmlExpressionDropped => "GW002",
304
305 Self::Custom { code, .. } => code.as_str(),
306 }
307 }
308
309 fn severity(&self) -> Severity {
310 match self {
311 #[cfg(feature = "lexer")]
313 Self::InvalidCharacter
314 | Self::InvalidFrontMatter
315 | Self::UnterminatedString
316 | Self::UnterminatedExpression
317 | Self::UnexpectedEof
318 | Self::InvalidJsxSelfClosingTag
319 | Self::UnterminatedJsxTag
320 | Self::InvalidJsxClosingTag
321 | Self::InvalidJsxAttribute
322 | Self::UnterminatedCodeBlock => Severity::Error,
323 #[cfg(feature = "lexer")]
324 Self::EmptyFrontMatter => Severity::Warning,
325
326 #[cfg(feature = "parser")]
328 Self::UnterminatedLink
329 | Self::UnterminatedImage
330 | Self::UnterminatedInlineCode
331 | Self::UnterminatedCodeBlockBlock
332 | Self::UnterminatedJsxOpenTag
333 | Self::UnterminatedJsxCloseTag
334 | Self::UnterminatedJsxExpression
335 | Self::UnterminatedMdComment
336 | Self::UnterminatedFrontmatter
337 | Self::MismatchedJsxCloseTag
338 | Self::TableShapeMismatch
339 | Self::StraySetextUnderline
340 | Self::MissingJsxAttributeValue
341 | Self::ListMarkerOverflow => Severity::Error,
342 #[cfg(feature = "parser")]
343 Self::EmptyFrontmatter
344 | Self::InvalidFrontmatterYaml
345 | Self::HeadingLevelClamped
346 | Self::RecoveredUnterminatedJsx => Severity::Warning,
347
348 #[cfg(feature = "transform")]
350 Self::ImportFileNotFound
351 | Self::InvalidLineRange
352 | Self::RegistryIndexUnreadable
353 | Self::RegistryIndexMalformed
354 | Self::RegistryEntryNotFound
355 | Self::RegistrySourceUnreadable
356 | Self::ComponentSourceUnreadable
357 | Self::AssetCopyFailed
358 | Self::MermaidRenderFailed => Severity::Error,
359 #[cfg(feature = "transform")]
360 Self::MmdcUnavailable | Self::MissingComponentAttr | Self::AssetSourceMissing | Self::BaseDirNotFound => {
361 Severity::Warning
362 },
363
364 #[cfg(feature = "codegen")]
365 Self::MalformedJsxTagName => Severity::Error,
366 #[cfg(feature = "codegen")]
367 Self::MdxTableUnsupported | Self::HtmlExpressionDropped => Severity::Warning,
368
369 Self::Custom { severity, .. } => *severity,
370 }
371 }
372}