use std::ops::Range;
use miette::{Diagnostic, SourceSpan};
use thiserror::Error;
use super::ast::Span;
use super::{MarkdownImport, MarkdownParse};
use crate::diagnostic::{SourceError, SourceLanguage};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct MarkdownLanguage;
pub type MarkdownError = SourceError<MarkdownLanguage>;
#[derive(Debug, Clone, PartialEq, Eq, Error, Diagnostic)]
#[error("{message}")]
#[diagnostic(code(svugy::markdown::unresolved_target), severity(Warning))]
pub struct UnresolvedTarget {
pub message: String,
#[label("linked here")]
pub span: SourceSpan,
}
pub(crate) type Diagnostics = crate::diagnostic::Diagnostics<MarkdownLanguage>;
impl SourceLanguage for MarkdownLanguage {
const ERROR_CODE: &'static str = "svugy::markdown";
type Warning = UnresolvedTarget;
fn import(source_text: &str) -> MarkdownImport {
let parsed = MarkdownParse::parse(source_text);
parsed.lower()
}
}
impl Diagnostics {
pub(crate) fn record_unresolved_target(&mut self, message: String, span: Span) {
let byte_range: Range<usize> = span.into();
let span = SourceSpan::from(byte_range);
let warning = UnresolvedTarget { message, span };
self.warnings.push(warning);
}
}