| use core::fmt::{self, Debug, Display}; |
| |
| use std::error::Error as StdError; |
| |
| use crate::{Diagnostic, LabeledSpan, Report, SourceCode}; |
| |
| use crate as miette; |
| |
| #[repr(transparent)] |
| pub(crate) struct DisplayError<M>(pub(crate) M); |
| |
| #[repr(transparent)] |
| pub(crate) struct MessageError<M>(pub(crate) M); |
| |
| pub(crate) struct NoneError; |
| |
| impl<M> Debug for DisplayError<M> |
| where |
| M: Display, |
| { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| Display::fmt(&self.0, f) |
| } |
| } |
| |
| impl<M> Display for DisplayError<M> |
| where |
| M: Display, |
| { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| Display::fmt(&self.0, f) |
| } |
| } |
| |
| impl<M> StdError for DisplayError<M> where M: Display + 'static {} |
| impl<M> Diagnostic for DisplayError<M> where M: Display + 'static {} |
| |
| impl<M> Debug for MessageError<M> |
| where |
| M: Display + Debug, |
| { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| Debug::fmt(&self.0, f) |
| } |
| } |
| |
| impl<M> Display for MessageError<M> |
| where |
| M: Display + Debug, |
| { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| Display::fmt(&self.0, f) |
| } |
| } |
| |
| impl<M> StdError for MessageError<M> where M: Display + Debug + 'static {} |
| impl<M> Diagnostic for MessageError<M> where M: Display + Debug + 'static {} |
| |
| impl Debug for NoneError { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| Debug::fmt("Option was None", f) |
| } |
| } |
| |
| impl Display for NoneError { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| Display::fmt("Option was None", f) |
| } |
| } |
| |
| impl StdError for NoneError {} |
| impl Diagnostic for NoneError {} |
| |
| #[repr(transparent)] |
| pub(crate) struct BoxedError(pub(crate) Box<dyn Diagnostic + Send + Sync>); |
| |
| impl Diagnostic for BoxedError { |
| fn code<'a>(&'a self) -> Option<Box<dyn Display + 'a>> { |
| self.0.code() |
| } |
| |
| fn severity(&self) -> Option<miette::Severity> { |
| self.0.severity() |
| } |
| |
| fn help<'a>(&'a self) -> Option<Box<dyn Display + 'a>> { |
| self.0.help() |
| } |
| |
| fn url<'a>(&'a self) -> Option<Box<dyn Display + 'a>> { |
| self.0.url() |
| } |
| |
| fn labels<'a>(&'a self) -> Option<Box<dyn Iterator<Item = LabeledSpan> + 'a>> { |
| self.0.labels() |
| } |
| |
| fn source_code(&self) -> Option<&dyn miette::SourceCode> { |
| self.0.source_code() |
| } |
| |
| fn related<'a>(&'a self) -> Option<Box<dyn Iterator<Item = &'a dyn Diagnostic> + 'a>> { |
| self.0.related() |
| } |
| |
| fn diagnostic_source(&self) -> Option<&dyn Diagnostic> { |
| self.0.diagnostic_source() |
| } |
| } |
| |
| impl Debug for BoxedError { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| Debug::fmt(&self.0, f) |
| } |
| } |
| |
| impl Display for BoxedError { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| Display::fmt(&self.0, f) |
| } |
| } |
| |
| impl StdError for BoxedError { |
| fn source(&self) -> Option<&(dyn StdError + 'static)> { |
| self.0.source() |
| } |
| |
| fn description(&self) -> &str { |
| #[allow(deprecated)] |
| self.0.description() |
| } |
| |
| fn cause(&self) -> Option<&dyn StdError> { |
| #[allow(deprecated)] |
| self.0.cause() |
| } |
| } |
| |
| pub(crate) struct WithSourceCode<E, C> { |
| pub(crate) error: E, |
| pub(crate) source_code: C, |
| } |
| |
| impl<E: Diagnostic, C: SourceCode> Diagnostic for WithSourceCode<E, C> { |
| fn code<'a>(&'a self) -> Option<Box<dyn Display + 'a>> { |
| self.error.code() |
| } |
| |
| fn severity(&self) -> Option<miette::Severity> { |
| self.error.severity() |
| } |
| |
| fn help<'a>(&'a self) -> Option<Box<dyn Display + 'a>> { |
| self.error.help() |
| } |
| |
| fn url<'a>(&'a self) -> Option<Box<dyn Display + 'a>> { |
| self.error.url() |
| } |
| |
| fn labels<'a>(&'a self) -> Option<Box<dyn Iterator<Item = LabeledSpan> + 'a>> { |
| self.error.labels() |
| } |
| |
| fn source_code(&self) -> Option<&dyn miette::SourceCode> { |
| Some(&self.source_code) |
| } |
| |
| fn related<'a>(&'a self) -> Option<Box<dyn Iterator<Item = &'a dyn Diagnostic> + 'a>> { |
| self.error.related() |
| } |
| |
| fn diagnostic_source(&self) -> Option<&dyn Diagnostic> { |
| self.error.diagnostic_source() |
| } |
| } |
| |
| impl<C: SourceCode> Diagnostic for WithSourceCode<Report, C> { |
| fn code<'a>(&'a self) -> Option<Box<dyn Display + 'a>> { |
| self.error.code() |
| } |
| |
| fn severity(&self) -> Option<miette::Severity> { |
| self.error.severity() |
| } |
| |
| fn help<'a>(&'a self) -> Option<Box<dyn Display + 'a>> { |
| self.error.help() |
| } |
| |
| fn url<'a>(&'a self) -> Option<Box<dyn Display + 'a>> { |
| self.error.url() |
| } |
| |
| fn labels<'a>(&'a self) -> Option<Box<dyn Iterator<Item = LabeledSpan> + 'a>> { |
| self.error.labels() |
| } |
| |
| fn source_code(&self) -> Option<&dyn miette::SourceCode> { |
| Some(&self.source_code) |
| } |
| |
| fn related<'a>(&'a self) -> Option<Box<dyn Iterator<Item = &'a dyn Diagnostic> + 'a>> { |
| self.error.related() |
| } |
| |
| fn diagnostic_source(&self) -> Option<&dyn Diagnostic> { |
| self.error.diagnostic_source() |
| } |
| } |
| |
| impl<E: Debug, C> Debug for WithSourceCode<E, C> { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| Debug::fmt(&self.error, f) |
| } |
| } |
| |
| impl<E: Display, C> Display for WithSourceCode<E, C> { |
| fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { |
| Display::fmt(&self.error, f) |
| } |
| } |
| |
| impl<E: StdError, C> StdError for WithSourceCode<E, C> { |
| fn source(&self) -> Option<&(dyn StdError + 'static)> { |
| self.error.source() |
| } |
| } |
| |
| impl<C> StdError for WithSourceCode<Report, C> { |
| fn source(&self) -> Option<&(dyn StdError + 'static)> { |
| self.error.source() |
| } |
| } |