1
0
dust/dust-lang/src/dust_error.rs

67 lines
2.2 KiB
Rust
Raw Normal View History

2024-11-06 20:40:37 +00:00
//! Top-level Dust errors with source code annotations.
2024-09-10 05:04:30 +00:00
use annotate_snippets::{Level, Renderer, Snippet};
2024-11-06 20:40:37 +00:00
use crate::{vm::VmError, CompileError, Span};
2024-11-06 00:38:26 +00:00
/// A top-level error that can occur during the execution of Dust code.
///
/// This error can display nicely formatted messages with source code annotations.
2024-09-07 16:15:47 +00:00
#[derive(Debug, PartialEq)]
pub enum DustError<'src> {
2024-11-06 20:40:37 +00:00
Compile {
error: CompileError,
source: &'src str,
},
Runtime {
error: VmError,
source: &'src str,
},
}
2024-09-10 05:04:30 +00:00
impl<'src> DustError<'src> {
pub fn report(&self) -> String {
let mut report = String::new();
let renderer = Renderer::styled();
match self {
DustError::Runtime { error, source } => {
let position = error.position();
2024-11-06 20:40:37 +00:00
let label = format!("{}: {}", VmError::title(), error.description());
let details = error
.details()
.unwrap_or_else(|| "While running this code".to_string());
let message = Level::Error.title(&label).snippet(
Snippet::source(source)
2024-10-13 11:14:12 +00:00
.fold(false)
.annotation(Level::Error.span(position.0..position.1).label(&details)),
);
report.push_str(&renderer.render(message).to_string());
}
2024-11-06 20:40:37 +00:00
DustError::Compile { error, source } => {
let position = error.position();
2024-11-06 20:40:37 +00:00
let label = format!("{}: {}", CompileError::title(), error.description());
let details = error
.details()
.unwrap_or_else(|| "While parsing this code".to_string());
let message = Level::Error.title(&label).snippet(
Snippet::source(source)
2024-10-13 11:14:12 +00:00
.fold(false)
.annotation(Level::Error.span(position.0..position.1).label(&details)),
2024-09-10 05:04:30 +00:00
);
report.push_str(&renderer.render(message).to_string());
}
}
report
}
}
pub trait AnnotatedError {
fn title() -> &'static str;
fn description(&self) -> &'static str;
fn details(&self) -> Option<String>;
fn position(&self) -> Span;
}