1use std::fmt;
2
3use crate::span::Span;
4
5#[derive(Debug, Clone)]
7pub struct Error {
8 message: String,
9 span: Span,
10}
11
12impl Error {
13 pub fn new<T: fmt::Display>(span: Span, message: T) -> Self {
15 Error {
16 message: message.to_string(),
17 span,
18 }
19 }
20
21 pub(crate) fn expected_token(span: Span, expected: &str) -> Self {
23 Error {
24 message: format!("expected {}", expected),
25 span,
26 }
27 }
28
29 pub fn span(&self) -> Span {
31 self.span
32 }
33
34 pub fn message(&self) -> &str {
36 &self.message
37 }
38}
39
40impl fmt::Display for Error {
41 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42 let loc = self.span.start();
43 write!(f, "error at byte offset {}: {}", loc, self.message)
44 }
45}
46
47impl std::error::Error for Error {}
48
49pub type Result<T> = std::result::Result<T, Error>;