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

59 lines
1.7 KiB
Rust
Raw Normal View History

2024-09-10 05:04:30 +00:00
use annotate_snippets::{Level, Renderer, Snippet};
2024-09-07 10:38:12 +00:00
use crate::{vm::VmError, LexError, ParseError};
2024-09-07 16:15:47 +00:00
#[derive(Debug, PartialEq)]
pub enum DustError<'src> {
2024-09-07 16:15:47 +00:00
Lex {
error: LexError,
source: &'src str,
},
2024-09-07 16:15:47 +00:00
Parse {
error: ParseError,
source: &'src str,
},
2024-09-07 16:15:47 +00:00
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();
let description = error.description();
let message = Level::Error.title(VmError::title()).snippet(
Snippet::source(source).fold(true).annotation(
Level::Error
.span(position.0..position.1)
.label(&description),
),
);
report.push_str(&renderer.render(message).to_string());
}
DustError::Parse { error, source } => {
let position = error.position();
let description = error.description();
let message = Level::Error.title(ParseError::title()).snippet(
2024-09-10 05:04:30 +00:00
Snippet::source(source).fold(true).annotation(
Level::Error
.span(position.0..position.1)
.label(&description),
),
);
report.push_str(&renderer.render(message).to_string());
}
_ => todo!(),
}
report
}
}