use serde::{Deserialize, Serialize};
use crate::types::Span;
#[derive(Debug, Clone, thiserror::Error)]
pub enum ParseError {
#[error("Invalid front matter: {message}")]
FrontMatter { message: String, span: Span },
#[error("Unclosed block directive '{name}' opened at line {line}")]
UnclosedBlock { name: String, line: usize },
#[error("Invalid attribute syntax: {message}")]
InvalidAttrs { message: String, span: Span },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Diagnostic {
pub severity: Severity,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub span: Option<Span>,
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub fix: Option<Fix>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextEdit {
pub span: Span,
pub replacement: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum FixSafety {
Safe,
Suggested,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Fix {
pub edits: Vec<TextEdit>,
pub safety: FixSafety,
pub description: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Severity {
Error,
Warning,
Info,
}