|  | 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() | 
|  | } | 
|  | } |