1use serde::{Deserialize, Serialize};
2
3use crate::types::Span;
4
5#[derive(Debug, Clone, thiserror::Error)]
7pub enum ParseError {
8 #[error("Invalid front matter: {message}")]
9 FrontMatter { message: String, span: Span },
10
11 #[error("Unclosed block directive '{name}' opened at line {line}")]
12 UnclosedBlock { name: String, line: usize },
13
14 #[error("Invalid attribute syntax: {message}")]
15 InvalidAttrs { message: String, span: Span },
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct Diagnostic {
24 pub severity: Severity,
25 pub message: String,
26 #[serde(skip_serializing_if = "Option::is_none")]
27 pub span: Option<Span>,
28 #[serde(skip_serializing_if = "Option::is_none")]
29 pub code: Option<String>,
30}
31
32#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
34#[serde(rename_all = "lowercase")]
35pub enum Severity {
36 Error,
37 Warning,
38 Info,
39}