use std::fmt;
use crate::parser::Span;
use super::code::Code;
pub struct Cause {
span: Span,
code: Code,
message: Box<str>,
}
impl Cause {
pub fn new<S, M>(span: S, code: Code, message: M) -> Self
where
S: Into<Span>,
M: fmt::Display,
{
Self {
span: span.into(),
code,
message: message.to_string().into_boxed_str(),
}
}
#[inline]
pub fn span(&self) -> Span {
self.span
}
#[inline]
pub fn code(&self) -> Code {
self.code
}
#[inline]
pub fn message(&self) -> &str {
&self.message
}
}
impl PartialEq for Cause {
fn eq(&self, other: &Self) -> bool {
self.span == other.span && self.code == other.code
}
}
impl fmt::Display for Cause {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if f.alternate() {
write!(f, "{}: {}", self.span, self.message)
} else {
write!(f, "{}", self.message)
}
}
}
impl fmt::Debug for Cause {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
if f.alternate() {
write!(f, "{:?}: [0x{:08x}] {}", self.span, self.code, self.message)
} else {
write!(f, "{}: [0x{:08x}] {}", self.span, self.code, self.message)
}
}
}